よくわからないコマンドプロンプト。

ちょっとCMD.EXEシリーズ。

なにがわからないかというと、空白文字の扱い。

たとえば a.bat という名前で次の内容のファイルを作ります。

@echo %1

これを、a.bat あいうえお_かきくけこ と引数を与えて実行します。 "_" は全角空白に置き換えてください。

すると、 "あいうえお" が返ってきます。つまり全角空白がデリミタ (区切り文字) として処理されています。

次にコマンドプロンプトで直接

set a=あいうえお かきくけこ
echo %a%
あいうえお かきくけこ

今度は全角空白がデリミタではなく文字として扱われています。

これはかなり困った仕様で、バッチファイルに「ファイル名に全角空白文字を含んだファイル」を食わせると、勝手に分解してしまうのです。その結果、「指定されたファイルが見つかりません」エラーになります。全角空白をデリミタとして処理してしまうということを知らないと、なにがおかしいのかまったく見当もつかない状態になります。

これを防ぐにはダブルクォーテーションで文字列を囲うという方法があるのですが、その方法はドラッグ&ドロップでバッチファイルに食わせるときには使えません。つまり自動的には行ってくれません。それを解決するには、引数で与えられたファイル名をバッチファイル内部でダブルクォーテーションで囲い直す、などという処理が必要になってきます。

ところがたちの悪いことに、バッチファイルに「ファイル名に半角空白文字を含んだファイル」をドラッグ&ドロップで食わせると、コマンドプロンプトがバッチファイル内で自動的にダブルクォーテーションで囲ってしまうのです。するとどういうことが起こるかというと、「すでにダブルクォーテーションで囲われている文字列をさらにダブルクォーテーションで囲う」ということになり、結果「ダブルクォーテーションで囲われていない」のと同じ状態になってしまうのです。

それからファイル名に "&" の文字を含んでいるファイルをバッチファイルに食わせると、 "&" 以降を別のコマンドとして実行しようとしますので、これも注意が必要です。

はぁ…。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...