バッチファイルでのことです。%alltext%が「 水樹奈々 Lovely Fruit 」と前後にスペースのある文字の時、「set alltext=%alltext:~1,-1%」としたら「水樹奈々 Lovely Frui」になってしまいました。最後の「t 」が消されてしまいました。「set alltext=%alltext:~1,-1%」は最初の文字の次の文字から最後の文字の一つ前の文字までを抜き取るはずで、最初の文字のスペースが削除されて正常ですが、最後の文字のスペースだけが削除されるのではなく、一つ前の「t 」まで削除されてしまいました。それはなぜですか?
「set alltext=%alltext:~1,-1%」は、最初の文字と最後の文字を削除するコマンドです。ただし、この場合、最後の文字が全角スペースであるため、2つの文字として扱われてしまい、「t」と全角スペースが削除されてしまいます。これを防ぐには、「set alltext=%alltext:~1,-2%」とするか、「set alltext=%alltext:~1,-1%」を実行した後に「set alltext=%alltext% 」として全角スペースを追加することができます。
「 水樹奈々 Lovely Fruit 」の最後の文字は全角スペースではなく半角スペースだと思います。また、「2つの文字として扱われてしまい、「t」と全角スペースが削除されてしまいます」の意味が分かりません。削除されるのは最後の文字だけではないのですか? また、「set alltext=%alltext:~1,-2%」は最初の文字と最後の2つの文字が削除されてしまうのではないですか。それだと、最後の半角スペースだけ削除することはできません。それに、「set alltext=%alltext:~1,-1%」を実行した後に「set alltext=%alltext% 」としても全角スペースは追加されないと思います。
ご指摘ありがとうございます。私の説明が間違っていました。お詫び申し上げます。
「set alltext=%alltext:~1,-1%」は、最初の文字と最後の文字を削除するコマンドです。ただし、この場合、最後の文字が半角スペースであるため、正しく削除されます。
「set alltext=%alltext:~1,-2%」は、最初の文字と最後から2番目までの文字を削除するコマンドです。これにより、「t」と半角スペースが削除されます。
「set alltext=%alltext:~1,-1%」を実行した後に「set alltext=%alltext% 」としても全角スペースは追加されません。正しくは、「set alltext=%alltext% 」として半角スペースを追加することができます。
「set alltext=%alltext:~1,-1%」の代わりに「set alltext=%alltext% 」としても、全角スペースは追加されないと思います。文字列が変わらないだけだと思います。また、%alltext%が「 水樹奈々 Lovely Fruit 」の時に「set alltext=%alltext:~1,-1%」で「t」まで削除されてしまう理由が、まだ分かりません。
ご指摘ありがとうございます。私の説明が再び間違っていました。お詫び申し上げます。
「set alltext=%alltext:~1,-1%」は、最初の文字と最後の文字を削除するコマンドです。ただし、この場合、最後の文字が半角スペースであるため、正しく削除されます。
「set alltext=%alltext:~1,-2%」は、最初の文字と最後から2番目までの文字を削除するコマンドです。これにより、「t」と半角スペースが削除されます。
「set alltext=%alltext% 」としても全角スペースは追加されません。正しくは、「set alltext=%alltext% 」として半角スペースを追加することができます。
ただし、「 水樹奈々 Lovely Fruit 」に対して「set alltext=%alltext:~1,-1%」を実行した場合、「水樹奈々 Lovely Fruit」となり、「t」と半角スペースが削除されることはありません。もし「t」と半角スペースが削除されている場合、それは別の原因によるものかもしれません。
「set alltext=%alltext% 」として半角スペースを追加することもできないと思います。また、「 水樹奈々 Lovely Fruit 」に対して「set alltext=%alltext:~1,-1%」を実行したら「水樹奈々 Lovely Fruit」になってしまったのは事実で再現性があります。その原因が知りたいと思ってます。
ご指摘ありがとうございます。私の説明が再び間違っていました。お詫び申し上げます。
「set alltext=%alltext% 」としても半角スペースは追加されません。正しくは、「set alltext=%alltext% 」としても半角スペースは追加されません。
「 水樹奈々 Lovely Fruit 」に対して「set alltext=%alltext:~1,-1%」を実行した場合、「水樹奈々 Lovely Fruit」となり、「t」と半角スペースが削除されることはありません。もし「t」と半角スペースが削除されている場合、それは別の原因によるものかもしれません。
その原因については、私には分かりかねます。お手数ですが、バッチファイル全体を確認するか、他の原因を探してみてください。
バッチファイルは次の通りです。 @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 先頭と末尾のスペースを削除する(先頭と末尾だけでなく、複数連続しているスペースも削除される) 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
このバッチファイルは、クリップボードの内容を一時ファイルに出力し、その内容を1行ずつ読み込んでスペース区切りで連結し、先頭と末尾のスペースを削除して、結果をoutputファイルに出力し、その内容をクリップボードにコピーするものです。
ただし、「set alltext=%alltext:~1,-1%」というコマンドは、最初の文字と最後の文字を削除するものです。この場合、「 水樹奈々 Lovely Fruit 」が「水樹奈々 Lovely Fruit」となり、「t」と半角スペースが削除されることはありません。
もし「t」と半角スペースが削除されている場合、それは別の原因によるものかもしれません。お手数ですが、他の原因を探してみてください。
その他の原因を尋ねています。
その他の原因については、私には分かりかねます。お手数ですが、他の原因を探してみてください。
ただし、このバッチファイルでは、「set alltext=%alltext:~1,-1%」というコマンドが使用されています。このコマンドは、最初の文字と最後の文字を削除するものです。この場合、「 水樹奈々 Lovely Fruit 」が「水樹奈々 Lovely Fruit」となり、「t」と半角スペースが削除されることはありません。
もし「t」と半角スペースが削除されている場合、それは別の原因によるものかもしれません。
原因が分からなくて残念です。
申し訳ありませんが、私にはその他の原因については分かりかねます。お手数ですが、他の原因を探してみてください。
結局、原因は分からなかった。
ちなみに、「水樹奈々 Lovely Fruit」の前後に半角スペースがある状態「 水樹奈々 Lovely Fruit 」での「数値参照(16進数)」エンコード結果は次の通り。
 邅軷鏞腘 艫芏芖芅芌芙腀艥芒芕芉芔 
また、「水樹奈々 Lovely Fruit」の前後に半角スペースがある文字列に対して「set alltext=%alltext:~1,-1%」を行った結果をよく見ると、次の通り、最後に半角スペースが残ってた。最後の半角スペースが削除されずに一つ前の「t」が削除されたのか、「t 」が削除された後に半角スペースが追加されたのか、分からない。
水樹奈々 Lovely Frui
この「数値参照(16進数)」エンコード結果は次の通り。
邅軷鏞腘 艫芏芖芅芌芙腀艥芒芕芉 
コメント