Windowsバッチ コマンドで空白(スペース)が含まれている場合の挙動
最近バッチの呼び出しで沼にはまったので備忘として残しておきます。
内容としては、Windowsバッチを起動したときに内部で呼び出ししているファイルのパスが間違ってるか見つからないよぉ!というエラー内容だったのだけどファイルパスを何度読み返してもちゃんと配置されてるしあってんだよね/(^o^)\困ったわかんね状態でした。
先輩に聞いてみたらパスにスペースとか入ってんじゃね?って言われて気が付きました。。。orz
スペース入ってるぅぅぅこんな簡単なことに気が付かないとは。。。
Windowsのパスにスペースが入ってたらエラーになるよ検証
パスにスペースなしのエラーにならないバッチ呼び出しを検証
Windowsバッチの検証になるので一応Windowsのバージョン情報を記載します。
C:\Temp>ver Microsoft Windows [Version 6.1.7601]
検証するフォルダ構成は以下となります。C:\Temp配下に「sample1.bat」をC:\Temp\Work配下に「sample2.bat」を配置します。
C:\Temp>tree /f C:. │ sample1.bat │ └─Work sample2.bat
sample1.batの内容
echo Hello world! [sample1.bat] call C:\Temp\Work\sample2.bat pause
sample2.batの内容
echo Hello world! [sample2] pause
実行結果
C:\Temp>echo Hello world! [sample1.bat] Hello world! [sample1.bat] C:\Temp>call C:\Temp\Work\sample2.bat C:\Temp>echo Hello world! [sample2] Hello world! [sample2] C:\Temp>pause 続行するには何かキーを押してください . . . C:\Temp>pause 続行するには何かキーを押してください . . .
ただのcallを使用したバッチ呼び出しなので当たり前ですが呼び出しに成功していますね\(^o^)/
パスにスペースありのエラーになってしまうバッチ呼び出しを検証
ここからが本題のエラーになってしまうバッチ呼び出しです。
検証するフォルダ構成は以下となります。C:\Temp配下に「sample1.bat」をC:\Temp\Work Work配下に「sample2.bat」を配置します。
ここ重要です!「Work Work」ワークとワークの間にスペースを入れました。これでバッチ呼び出しがどのようになるか検証します。
C:\Temp>tree /f C:. │ sample1.bat │ └─Work Work sample2.bat
sample1.batの内容
echo Hello world! [sample1.bat] call C:\Temp\Work Work\sample2.bat pause
sample2.batの内容
さきほどの検証で使ったものと同じものを使用しています。
実行結果
C:\Temp>echo Hello world! [sample1.bat] Hello world! [sample1.bat] C:\Temp>call C:\Temp\Work Work\sample2.bat 'C:\Temp\Work' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 C:\Temp>pause 続行するには何かキーを押してください . . .
はい。「’C:\Temp\Work’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」とエラーメッセージがでてきて見事に空白が入っているところでパスとして読み込めてないことがわかると思います。検証が終わったので、対応策について記述していきます。
Windowバッチの呼び出しの際にパスにスペースがある場合の対応方法
対応方法としては、調べた結果2つの方法があるとわかりました。他にもいい方法とか留意点が抜けてるとかあったら教えてくださいm(_ _)m
パスをダブルクォーテーションでくくる方法
これが一番カンタンな気がします。何も考えずにダブルクォーテーションでくくっちゃえばいいはず!
さきほど検証したスペースありの「sample1.bat」のパスをダブルクォーテーションでくくって検証してみます。フォルダ構成と「sample2.bat」は同様のため説明割愛。
sample1.batの内容
echo Hello world! [sample1.bat] call "C:\Temp\Work Work\sample2.bat" pause
実行結果
C:\Temp>echo Hello world! [sample1.bat] Hello world! [sample1.bat] C:\Temp>call "C:\Temp\Work Work\sample2.bat" C:\Temp>echo Hello world! [sample2] Hello world! [sample2] C:\Temp>pause 続行するには何かキーを押してください . . . C:\Temp>pause 続行するには何かキーを押してください . . .
やったー!\(^o^)/「sample2.bat」が動いていますね。
パスをショートパスで書き換える方法
WindowsのパスはMS-DOS8.3形式の空白を含まないショートパスでも管理されているみたいなので、ショートパスで書き換えれば実行できます。ショートパスは「dir」コマンドの「/x」オプションで表示することができます。
C:\Temp>dir /x C:\Temp のディレクトリ 2019/05/13 03:22 <DIR> . 2019/05/13 03:22 <DIR> .. 2019/05/13 03:40 84 sample1.bat 2019/05/13 02:22 <DIR> WORKWO~1 Work Work
「WORKWO~1」ってなっているのが「Work Work」フォルダのショートパス名になります。この値を使って「sample1.bat」のパス名を書き換えます。
sample1.batの内容
echo Hello world! [sample1.bat] call C:\Temp\WORKWO~1\sample2.bat pause
検証結果
C:\Temp>echo Hello world! [sample1.bat] Hello world! [sample1.bat] C:\Temp>call C:\Temp\WORKWO~1\sample2.bat C:\Temp>echo Hello world! [sample2] Hello world! [sample2] C:\Temp>pause 続行するには何かキーを押してください . . . C:\Temp>pause 続行するには何かキーを押してください . . .
ショートパスで実行できました。\(^o^)/
コメント