【bat】変数の末尾に余計な空白が入ってしまうときの原因と対策

バッチファイルで文字列やパスを変数に代入すると、意図しない余計な空白が末尾に入り、比較や結合がうまくいかないことがあります。
例えば if 判定が失敗したり、cd が「パスが見つかりません」となるなど、地味ながら厄介なトラブルです。
本記事では、その原因と対策を整理します。

原因1:set コマンドの書式に余計なスペース

set VAR=値 の形式で代入する際、イコールの前後に空白を入れるとそのまま値として記録されてしまいます。

@echo off
set VAR=ABC    
echo [%VAR%]

上記の場合、実際には ABC␣␣␣(末尾に空白)が格納されます。
これはバッチ特有の仕様で、代入時の空白も文字列として保持されるためです。

対策1:set “VAR=値” の形式を徹底

値を代入するときは、常に set "VAR=値" の形式にします。
こうするとイコールの外側の空白は無視され、末尾空白も入らなくなります。

@echo off
set "VAR=ABC"
echo [%VAR%]   &rem 出力は [ABC]

原因2:入力から読み込んだ値に空白や改行が含まれる

for /f でファイルやコマンド出力を読み込むと、行末の空白やタブ、改行がそのまま変数に入ることがあります。

@echo off
for /f "delims=" %%A in ("input.txt") do (
  set LINE=%%A
  echo [%LINE%]
)

ファイルの内容に末尾スペースがあれば、そのまま取り込まれます。

対策2:trim処理で余計な空白を除去する

バッチには標準の trim 関数はありませんが、for 文で再展開して余計な空白を削除できます。

@echo off
set "VAR=ABC    "
for /f "tokens=* delims= " %%A in ("%VAR%") do set "VAR=%%A"
echo [%VAR%]

これで「ABC」だけが残ります。
末尾の改行やタブが気になる場合は PowerShell で処理するのも有効です。

@echo off
for /f "usebackq delims=" %%A in (`
  powershell -NoProfile -Command "'%VAR%'.Trim()"
`) do set "VAR=%%A"

原因3:入力リダイレクトやユーザー入力

set /p で入力を受けた場合、入力した文字列の後ろに空白を入れるとそのまま格納されます。

@echo off
set /p VAR=文字を入力してください:
echo [%VAR%]

対策: 入力後に同様の trim 処理を適用すると安定します。

まとめ

変数の末尾に余計な空白が入る原因は「set コマンドの書式」「入力やファイルからの読み込み」「ユーザー入力」です。
以下の対策を徹底すれば多くのトラブルを防げます。

  • 代入は set "VAR=値" を徹底する
  • 入力値は for /f や PowerShell で trim する
  • ユーザー入力もそのまま信用せず整形する

これらを押さえておけば、余計な空白が原因で処理が失敗するのを防ぎ、バッチファイルの安定性を高められます。