msdosのfor /fのtokens=の挙動

このQ&Aのポイント
  • Windows7のmsdosのfor /fのtokens=の挙動について、指定したトークンの取り出し方が思った通りにならない理由について詳しく説明しています。
  • 具体的には、tokens=1,3とした場合とtokens=1-3とした場合の違いや、サンプルのコードと実際の結果の違いについて説明しています。
  • 実際には、例示されたコードでは、1番目のトークンしか取り出されておらず、なぜそのような結果になるのかについても解説しています。
回答を見る
  • ベストアンサー

msdosのfor /fのtokens=の挙動

Windows7のmsdosのfor /fのtokens=の挙動ですが、 tokens=1,3とした時は1番目と3番目のトークンが取り出され tokens=1-3とした時は1番目~3番目のトークンが取り出される のではないのでしょうか。 例えば、以下のような例の場合、 test1.batでは、 a b d f test2.batでは、 a b c d e f となるように思うのですが 実際には、どちらも、 a b d となり、1番目のトークンしか 取り出されていないのですがなぜなのでしょうか。 ---test.txt--------------------------- a b,c d,e,f ---test1.bat------------------ for /f "tokens=1,3 delims=," %%a in (test.txt) do ( echo %%a ) ---test2.bat------------------ for /f "tokens=1-3 delims=," %%a in (test.txt) do ( echo %%a ) ------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> echo %%a %aしかechoしていないからです。tokensで複数を指定した場合は、その後で指定した変数にすべてが入るのではなく、追加の変数名に割り当てられます。今回の場合であれば、2番目は%bに、3番目は%cに入ります。 使用例を検索すれば、%iを指定しているのに、実行するコマンドで%i,%j,%kのように複数使用しているのが見つかるはずです。 forコマンドのヘルプでも >FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k のような例が書かれています。 #ちなみに、Windows7にMS-DOSはありません。コマンドプロンプトです。

yam2012
質問者

お礼

%%bと%%cを追加したら表示されるようになりました。 MS-DOSではなくコマンドプロンプトと表記するようにします。 ありがとうございました。

関連するQ&A

  • 【DOSコマンド】for の デリミタにダブルクォーテーションを使うには

    下記のような1行だけ書かれたテキストファイルがあり、その中からダブルクォーテーションで囲まれた部分を抜き出そうとしています。 --【abc.txt】----------------------------------------------------------- Command Line: "C:\Program Files\test\test.exe" ---ここまで------------------------------------------------------------- (C:\Program Files\test\test.exe を抜き出したい) DOSコマンドのfor文を使って抜き出そうとしたのですがダブルクォーテーションをどうやってデリミタに指定したらいいのかわかりません。   for /f 'delims=" tokens=2' %i in (test.txt) do @echo %i  とか   for /f "delims="" tokens=2" %i in (test.txt) do @echo %i など いろいろやってみたのですがエラーが出ました。 試しにテキストファイルのダブルクォーテーションを”+”に置き換えて試したところうまく出来たので、デリミタの指定の仕方だけだと思うのですが、どうしてもわかりません。 Command Line: +C:\Program Files\test\test.exe+   に対して for /f "delims=+ tokens=2" %i in (test.txt) do @echo %i はうまく出来ました。 どなたかご享受願えませんでしょうか。 よろしくお願いします。

  • バッチファイル 2ファイルをfor /f処理したい

    バッチファイルで別の2つのファイルを読み込んでfor /f処理するには 変換前のファイルのファイル名と 変換後のファイルのファイル名が それぞれ別のファイルに書かれていて この2つのファイルを読み込んで リネームするバッチファイルを 記述したいのですが 2つのfor /fを使った場合、 一方が他方にネストされてしまうのですが このような場合は どのように記述するのでしょうか。 例えば、 変換前のファイル名が書かれたファイル(s.txt)と 変換後のファイル名が書かれたファイル(d.txt) がある場合、 abc.txtをqrs.txt d f.txtをtuw.txt ghi.txtをx z.txt  : にリネームしたいのですが もちろんtest1.batではうまくいきません。 ---test1.bat------------------- for /f %%a in (s.txt) do for /f %%b in (d.txt) do ren "%%a" "%%b" ------------------------------ ---s.txt---------------------- abc.txt d f.txt ghi.txt : ---d.txt---------------------- qrs.txt tuw.txt x z.txt : ------------------------------ 以下の sd.txt のように1つのファイルにして test2.bat のようにすればできますが s.txt と d.txt の2つのファイルのままで処理するには どのように記述すればよいのでしょうか。 ---test2.bat------------------- for /f "tokens=1,2 delims=," %%a in (sd.txt) do ren "%%a" "%%b" ---sd.txt---------------------- abc.txt,qrs.txt d f.txt,tuw.txt ghi.txt,x z.txt : ------------------------------- よろしくお願いします。(Windows7)

  • FORコマンドで不定期に表示される意味不明なメッセージを回避する方法は?

    (「Windows/Windows Vistaフォーラム/Answersアシスタント」から飛ばされてきました。よろしくお願いします) 以下の様なバッチファイル(for1.bat, for2.bat)を作成して、コマンドプロンプトで何回か実行すると、正常な出力と同時に、不定期に「ファイル が見つかりません。」という意味不明なメッセージが表示されます。 これは何で、どうすれば回避できるのでしょうか? コマンドラインオプションとしてダブルクォートされた文字列を引数にとるバッチファイルを作りたいのですが、 > foo.bat " a""a " のような呼び出し方をした時に挙動がおかしくなったので、その原因を調べていたら、FOR文が時々不可解な動作をしていて、その典型的な例をfor1.batとfor2.batにまとめた次第です。 ---8<---8<---8<---[for1.bat:ここから ]---8<---8<---8<---8<--- @ECHO OFF CALL :SUB "a""a" CALL :SUB " a""a" CALL :SUB "a ""a" CALL :SUB " a ""a" CALL :SUB "a"" a" CALL :SUB "a""a " CALL :SUB "a"" a " CALL :SUB " a"" a" CALL :SUB "a ""a " CALL :SUB " a "" a " CALL :SUB " a""a " CALL :SUB "a "" a" CALL :SUB " a "" a" CALL :SUB " a ""a " CALL :SUB " a"" a " CALL :SUB "a "" a " GOTO EOF :SUB FOR /F "tokens=*" %%a IN ("%1") DO ECHO %%a EXIT /B 0 :EOF ---8<---8<---8<---[for1.bat:ここまで ]---8<---8<---8<---8<--- ---8<---8<---8<---[for2.bat:ここから ]---8<---8<---8<---8<--- @ECHO OFF FOR /F "tokens=*" %%a IN (""a""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a ""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a ""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a"" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a"" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a"" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a ""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a "" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a "" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a "" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a ""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a"" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a "" a "") DO ECHO %%a ---8<---8<---8<---[for2.bat:ここまで ]---8<---8<---8<---8<---

  • バッチファイル(for文)がうまく動かない

    以下のようなバッチファイルをWin2008上で実行しようとしています ------------------------------ @echo on set LOGFILE=C:\a.log set CONF=C:\a.txt FOR /F "tokens=1-3 delims=," %%i in (%CONF%) do ( echo %%i %%j %%k > %LOGFILE% 2>&1 ) ------------------------------ C:\a.txtの中身はこのようになっています ------------------------------ a,b,c e,f,g ------------------------------ 期待する結果は「1.」なのですが.batを実行しても「2.」の結果がログに表示されます どのように修正すれば期待の結果が得られますでしょうか ※ちなみに.batの実行ではなくコマンドプロンプトで[%%]を[%]に変更すれば正常に実行できました 1. ------------------------------ a b c e f g ------------------------------ 2. ------------------------------ e f g ------------------------------

  • windows batの一部分を繰り返し実行したい

    以下の部分を繰り返しbatで実行したいのですが、どうすればよいでしょうか? REM 取得したい行数-1を指定 FOR /F "tokens=1-9 skip=%LINE%" %%i in (dakoku_data.csv) DO ( SET B=%%i%%j%%k%%l%%m%%n%%o%%p%%q ECHO %%i%%j%%k%%l%%m%%n%%o%%p%%q>>insert.txt GOTO EXIT_FOR ) :EXIT_FOR ECHO %B% FOR /F "tokens=7-9 delims=," %%i in (insert.txt) DO set RR=%%i%%j if %RR%==000 FOR /F "tokens=1-3 delims=," %%i in (insert.txt) DO set C=20%%i-%%j-%%k if %RR%==000 FOR /F "tokens=4-5 delims=," %%l in (insert.txt) DO set D=%%l:%%m:00 if %RR%==000 FOR /F "tokens=6 delims=," %%i in (insert.txt) DO set E=%%i REM MySQL PATH set PATH="C:\Program Files\MySQL\MySQL Server 5.0\bin" REM CHARACTER ECHO set character set sjis;>__sql.sql REM if %RR%==000 ECHO INSERT INTO `XXX` VALUES ('%E%','2011-11-15 14:33:19', '%C%', '0', '%C%', '%D%', , '8',null, null, , '8', '1', '1', null, '', null);>>__sql.sql

  • for文使用時の変数の展開について

    初めて投稿します。 bat処理に関してfor文の制約?で困っています。 for文を2重に使用し(入れ子)、2つ目のfor文のオプションに変数を使用したいと思っています。 通常の変数(%data%)の場合は実行が可能なのですが、遅延環境変数(!data!)をトークンに使用すると、エラーとなって処理がうまくいきません。 ソースは以下のとおりです。 for /l %%e in (4,2,50) do ( set startToken=%%e set /a endToken=%%e+1 for /f "tokens=!startToken!,!endToken! delims=:" %%T in ("%fileLine%") do ( echo echo T %%T echo echo U %%U ) ) for文の制約なのでしょうか?

  • コマンドプロンプトでファイル読み込み

    For文を使って、パラメータファイルから値を読み込みたいのですが、 "C:\Documents and Settings\~"等(パスにスペースが含まれる場合)に置かれた場合、 ファイルを読み込んでくれず困っております。 ()内のファイル指定で、""(ダブルクォーテーション) や'(シングルクォーテーション)で囲むこともしてみましたが、ダメでした。。 どう指定すればよいのかご教授下さい。 よろしくお願いいたします。 【パラメータファイル(tmp.txt)】 ABC=12345 【バッチファイル(test.bat)】 for /F "delims== tokens=1,2" %%A in (D:\tmp.txt) do if %%A==ABC set value_1=%%B echo %value_1% pause

  • msdos for文 パスに!がある時の記述の仕方

    C:\test\dataのフォルダに入っているファイルの数と 最も古いファイルのファイル名は リスト1で取得できますが、 パスに!が入っているC:\test\!dataでは、 リスト2のようにしても、for文の所で、 指定されたファイルが見つかりません。 と表示されてしまいます。 パスに!が入っている時は、 どのように記述すればよいのでしょうか。 ---リスト1------------------------------------ @echo off set folder="C:\test\data\" for /F %%a in ('dir %folder% /a:-d ^| find "個のファイル"') do set num=%%a echo ファイルは %num% 個あります。 for /F %%F in ('dir %folder% /b /o:-d') do set filename=%%F echo 一番古いファイルは %filename% です。 ---リスト1の実行結果-------------------------- ファイルは 50 個あります。 一番古いファイルは test100.txt です。 ---------------------------------------------- ---リスト2------------------------------------ @echo off set folder="C:\test\!data\" for /F %%a in ('dir %folder% /a:-d ^| find "個のファイル"') do set num=%%a echo ファイルは %num% 個あります。 for /F %%F in ('dir %folder% /b /o:-d') do set filename=%%F echo 一番古いファイルは %filename% です。 ---リスト2の実行結果-------------------------- 指定されたファイルが見つかりません。 ファイルは 50 個あります。 指定されたファイルが見つかりません。 一番古いファイルは test100.txt です。 ---------------------------------------------- (実行環境 : Windows7のコマンドプロンプト)

  • バッチファイルで2行にわたるコマンドを入力したいのですが

    バッチファイルで複数行にわたるコマンドを打ちたいのですが、方法がわからなくて困っています。 for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do ( set hinichi=%%a%%b ) "C:\Program Files\Lhaca\Lhaca.exe" "test%hinichi%01.txt" "test%hinichi%02.txt" ・・・・・・・ と31個のファイルを圧縮するバッチです。 体裁の問題ですが、 for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do ( set hinichi=%%a%%b ) "C:\Program Files\Lhaca\Lhaca.exe" ? "test%hinichi%01.txt" ? "test%hinichi%02.txt" ・・・ としたいのですが各行のつなぎの記号?がわかりません。 ご存知の方、よろしくお願いいたします。

  • バッチコマンドの for文の使い方。

    以下のバッチファイルはテキストを一行ずつ3つの変数に読み込み <subtest.bat>の処理を行うものです。 この2つのバッチファイルを一つにまとめたいのですがどうすればいいでしょうか。ただし、<subtest.bat>内は実際には10行程度の文です。 goto文を使用してみよとしたのですがうまくいきませんでした。 どなたかわかる方がいらっしゃいましたら、教えていただけないでしょうか、お願いいたします。 ------------------------------------------------ rem <test.bat> @echo off for /F "usebackq tokens=1-3" %%a in ( file.txt ) do call subtest.bat %%c,%%b,%%a PAUSE exit -------------------------------------------------- rem <subtest.bat> rem 変数の表示 rem 実際には10行程度の文です。 @echo %3, %2, %1 -------------------------------------------------- <file.txt>の内容(タブ区切り) shin0.bmp1000 200 shin1.bmp 700 200 shin2.bmp 800 200 shin3.bmp 860 200 shin4.bmp 400 200 --------------------------------------------------