†DOSとバッチとスクリプト†
作成開始日 2024.08.25
最終更新日
SET /P st=<myfile.txt ECHO %st%ミソはSETコマンドの/Pオプション。本来、これは環境変数にプロンプトからの入力を代入する命令。それに、テキストファイルをリダイレクトしている。でもって、ファイルの先頭行末の改行コードが[Enter]に相当するので、これで先頭1行が読み込まれることになる。
尤も、この/Pオプションって、かなり気持ちの悪い仕様なんだよな。基本型は;
SET /P age="あなたの年齢を入力してください"
みたいなカンジで、変数にメッセージを代入しているように読めてしまう。普通に考えると、上記のようにテキストファイルをリダイレクトすると、テキストファイルの中身がメッセージとして表示されるような気がするのだが…
FOR /F "tokens=1-3" %%a IN (mydata.txt) DO ( SET name=%%a SET age=%%b SET id=%%cこの方法のキモは、GOTO命令でループ処理を1回で抜ける点。これによって、先頭行のデータが変数に代入される。なお、最後までループを回すと、最終行のデータが代入される。また、FOR文のskipオプションを指定することで、任意行のデータを代入することもできる。次の例では3行スキップして、4行目のデータを代入している。GOTO :break ) :break
FOR /F "tokens=1-3なお、バッチの書式は融通が効かないので注意。たとえば、以下のような書式はコンパクトで視認性も良いが、バッチではエラーになる。skip=3 " %%a IN (mydata.txt) DO ( SET name=%%a SET age=%%b SET id=%%c GOTO :break ) :break
FOR /F "tokens=1-3" %%a IN (mydata.txt) DO ( SET name=%%a & SET age=%%b & SET id=%%c & GOTO :break ) &:breakまず、GOTOの宛先のラベルは行頭にないとダメ。したがって、上記のような書式ではGOTOは機能しない。また、SETコマンドを「&」で繋げる場合は、スペースの有無に注意する必要がある。上記の例では「%%a」や「%%b」のあとに半角スペースがくっついてしまう。これを避けるには、以下のようにスペースを詰める必要がある。
SET name=%%a& SET age=%%b& SET id=%%c& …一般的なプログラム言語では半角スペースは割とルーズに扱えるが、バッチでは扱いがシビア。可読性を高めるために、適宜スペースを追加するというような事はしない方が賢明。