クリップボード内の文字列でGoogle検索するバッチファイル

 bing に教わったコードに疑問が生じたので質問してみた。

私

「set alltext=%alltext:~1,-1%」では末尾の文字も削除されてしまう可能性があるそうですが、それはどうしてですか? また、「for /f “tokens=* delims= ” %%a in (“%alltext%”) do set alltext=%%a」なら末尾の文字が削除されずに済むのはどうしてですか?

bing
bing

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の文字まで切り取ることを意味します。-1は末尾の文字を指すため、このコマンドでは末尾の文字も削除されます。

一方、「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」は、変数alltextの値をトークンに分割し、それらをスペースで区切ります。その後、各トークンが変数%%aに代入されます。このコマンドでは、末尾の文字が削除されずに済みます。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「-1は末尾の文字を指す」のに「set alltext=%alltext:~1,-1%」で先頭から末尾の文字を切り取る際に末尾の文字が含まれないのですか? また、「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」で、変数alltextの値をトークンに分割し、それらをスペースで区切り、その後、各トークンが変数%%aに代入する必要があるのはなぜですか? ンなことをせずに、%alltext% だけではダメなのですか?

bing
bing

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の文字まで切り取ることを意味します。-1は末尾の文字を指すため、このコマンドでは末尾の文字も削除されます。

「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」は、変数alltextの値をトークンに分割し、それらをスペースで区切ります。その後、各トークンが変数%%aに代入されます。このコマンドでは、末尾の文字が削除されずに済みます。

このコマンドは、「%alltext%」だけでは実現できない処理です。トークンに分割することで、特定の区切り文字(この場合はスペース)で区切られた部分ごとに処理することができるようになります。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「set alltext=%alltext:~1,0%」だとどうなりますか? また、トークンに分割して、区切られた?それぞれの部分のどのような処理をしているのですか?

bing
bing

「set alltext=%alltext:~1,0%」は、変数alltextの値を、最初の文字から0文字目まで切り取ることを意味します。つまり、何も切り取られず、変数alltextの値は変更されません。

「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」では、トークンに分割された各部分が変数%%aに代入されます。このコマンドでは、特定の処理は行われていません。ただし、このような構文を使用することで、トークンに分割された各部分ごとに独自の処理を実装することができます。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「このコマンドでは、特定の処理は行われていません」ということは、「%alltext%」のままでも結果は同じですか? また、「set alltext=%alltext:~1,-1%」で末尾が削除されちゃうのなら、切り取らずに「%alltext%」のままの方が良いですか?

bing
bing

「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」は、「%alltext%」と同じ結果になります。このコマンドは、変数alltextの値をトークンに分割し、それらをスペースで区切ります。その後、各トークンが変数%%aに代入されます。このコマンドでは、特定の処理は行われていません。

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の文字まで切り取ることを意味します。-1は末尾の文字を指すため、このコマンドでは末尾の文字も削除されます。このコマンドが必要かどうかは、目的によって異なります。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

alltextの前後のスペースを削除するために利用したようなのですが、「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」だとスペースが削除されますか? 「set alltext=%alltext:~1,-1%」は末尾にスペースがあった時だけ、末尾にスペースがない文字列になって意味を成すのですか?

bing
bing

「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」は、変数alltextの値をトークンに分割し、それらをスペースで区切ります。その後、各トークンが変数%%aに代入されます。このコマンドでは、変数alltextの値の前後にあるスペースが削除されます。

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の文字まで切り取ることを意味します。-1は末尾の文字を指すため、このコマンドでは末尾の文字も削除されます。このコマンドは、末尾にスペースがある場合に限り、末尾にスペースがない文字列になります。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「set alltext=%alltext:~1,-1%」は末尾にスペースがあることを前提に使ったのでスペースでない末尾の文字が削除されてしまったのですね。それに対し、「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」は%%aに末尾のスペースが代入されないので末尾のスペースを削除できたのですね。その理解でよろしいですか?

bing
bing

はい、その理解で正しいです。「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の文字まで切り取ることを意味します。-1は末尾の文字を指すため、このコマンドでは末尾の文字も削除されます。このコマンドは、末尾にスペースがある場合に限り、末尾にスペースがない文字列になります。

「for /f “tokens=* delims= ” %%a in (”%alltext%”) do set alltext=%%a」は、変数alltextの値をトークンに分割し、それらをスペースで区切ります。その後、各トークンが変数%%aに代入されます。このコマンドでは、変数alltextの値の前後にあるスペースが削除されます。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

おおむね理解しましたが、「最初の文字から末尾の文字まで切り取る」と言う場合、末尾の文字が含まれるような気がするのですが、削除されると聞いて疑問が生じました。

bing
bing

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の文字まで切り取ることを意味します。-1は末尾の文字を指すため、このコマンドでは末尾の文字も削除されます。

この表現について混乱させてしまい申し訳ありません。正確には、「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の一つ前まで切り取ることを意味します。-1は末尾の一つ前を指すため、このコマンドでは末尾の文字が削除されます。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「最初の文字から末尾の一つ前まで切り取ることを意味します。-1は末尾の一つ前を指すため、このコマンドでは末尾の文字が削除されます」で納得しました。ただ、どうして、末尾の一つ前の文字までしか切り取れないのでしょうか? 末尾を含めて切り取れないのでしょうか?

bing
bing

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の一つ前まで切り取ることを意味します。-1は末尾の一つ前を指すため、このコマンドでは末尾の文字が削除されます。

このコマンドでは、末尾を含めて切り取ることができます。ただし、「set alltext=%alltext:~1,-1%」という表現では、-1が末尾の一つ前を指すため、末尾の文字が削除されます。もし末尾を含めて切り取りたい場合は、「set alltext=%alltext:~0,-1%」という表現を使用することができます。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「set alltext=%alltext:~0,-1%」の「~0」はどのような意味ですか?

bing
bing

「set alltext=%alltext:~0,-1%」は、変数alltextの値を、最初の文字から末尾まで切り取ることを意味します。0は最初の文字を指し、-1は末尾の文字を指すため、このコマンドでは変数alltextの値がそのまま残ります。

「~0」は、「set alltext=%alltext:~0,-1%」という表現において、最初の文字を指します。この表現では、「~」記号が使用されており、「~」記号は、切り取る範囲を指定するために使用されます。「~0」は、「最初の文字から」という意味になります。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「~0」を「~1」にすると、「最初の文字から」ではないのですか?

bing
bing

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の一つ前まで切り取ることを意味します。1は最初の文字の次を指し、-1は末尾の一つ前を指すため、このコマンドでは最初と末尾の文字が削除されます。

「~1」は、「set alltext=%alltext:~1,-1%」という表現において、最初の文字の次を指します。この表現では、「~」記号が使用されており、「~」記号は、切り取る範囲を指定するために使用されます。「~1」は、「最初の文字から」という意味ではなく、「最初の文字の次から」という意味になります。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

「set alltext=%alltext:~1,-1%」だと、末尾の文字だけでなく、最初の文字も削除しちゃうのですね。それなら、「set alltext=%alltext:~0,-1%」でも末尾の文字は削除されちゃうのではないですか?

bing
bing

ご指摘いただきありがとうございます。私の説明が間違っていました。「set alltext=%alltext:~0,-1%」は、変数alltextの値を、最初の文字から末尾の一つ前まで切り取ることを意味します。0は最初の文字を指し、-1は末尾の一つ前を指すため、このコマンドでは末尾の文字が削除されます。

「set alltext=%alltext:~1,-1%」は、変数alltextの値を、最初の文字から末尾の一つ前まで切り取ることを意味します。1は最初の文字の次を指し、-1は末尾の一つ前を指すため、このコマンドでは最初と末尾の文字が削除されます。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

最初の文字も末尾の文字も削除しないで済むにはどうしたら良いですか?

bing
bing

最初の文字も末尾の文字も削除しないで済むには、変数alltextの値をそのまま使用することができます。つまり、「set alltext=%alltext%」という表現を使用することができます。

この表現では、変数alltextの値がそのまま残ります。最初の文字も末尾の文字も削除されず、変数alltextの値は変更されません。

ご質問はこれで解決しましたか? それとも他に何かお手伝いできることがありますか?

私

納得しました。ありがとうございました。

bing
bing

どういたしまして。お役に立てて嬉しいです。また何か質問があれば、お気軽にお問い合わせください。

 そんなわけで、クリップボード内の複数行の文字列の改行を半角スペースに置換するのは、次のコードでもいいんだよね。赤太文字の所は不要。

@echo off
setlocal enabledelayedexpansion
rem クリップボードの内容を一時ファイルに出力する
powershell -command "Get-Clipboard" > temp.txt
rem 置換後のファイル名を指定する
set output=kaigyou-to-space.txt
rem もし置換後のファイルが存在していたら削除する
if exist %output% del %output%
rem 以下のforループで一時ファイルの内容を1行ずつ読み込み、置換処理を行う
set "alltext="
for /f "delims=" %%a in (temp.txt) do (
    rem 変数lineに1行分のテキストを代入する
    set "line=%%a"
    rem 空行でなければ変数alltextに追加する(スペース区切り)
    if not "!line!" == "" set "alltext=!alltext! !line!"
)
rem 先頭と末尾のスペースを削除する(先頭と末尾だけでなく、複数連続しているスペースも削除される)
rem set alltext=%alltext:~1,-1%
rem for /f "tokens=* delims= " %%a in ("%alltext%") do set alltext=%%a
rem 結果をoutputファイルに出力する
echo %alltext% > %output%
rem 一時ファイルを削除する
del temp.txt
rem outputファイルの内容をクリップボードにコピーする
type %output% | clip.exe

 このコードで次の文字列を試した。

水樹奈々

Lovely Fruit

 出力は次のようになった。

 水樹奈々 Lovely Fruit 

 「水樹奈々 Lovely Fruit」の前後に半角スペースがある。それならば、「set alltext=%alltext:~1,-1%」で前後の半角スペースが削除されるだけで「t」は削除されないんじゃないか?
 bingに尋ねてみた。次のページの通り。

コメント

タイトルとURLをコピーしました