DOSコマンドでの処理がうまく行えない場合の対処方法

このQ&Aのポイント
  • DOSコマンドでバッチ処理を行う際に、条件分岐がうまく機能しない場合があります。この記事では、具体的な例を挙げながら、条件分岐の書き方と修正方法について解説します。
  • また、DOSコマンドの文法や基本的な使い方についても触れます。初心者の方でも理解しやすいように、具体的な例と解説を交えて紹介します。
  • さらに、バッチファイルの作成に役立つ情報を探している場合は、例文つきの詳しい解説があるHPを参考にすることをおすすめします。たくさんの例文を使って実践的なバッチファイル作成のヒントを得ることができます。
回答を見る
  • ベストアンサー

DOSのコマンドでうまく処理が行えません

下記のようなバッチ処理を行おうとしたのですが、なかなかうまく処理が行われず困っています。 FOR /F " %%J IN (A.TXT) DO (   SET ANS_SET=%%J   SET ANS_VAL=%ANS_SET:~0,3% IF %ANS_SET% == "SPC" (   ECHO テストA >> test.txt    ) else (    ECHO テストB >> test.txt    ) ) A.txtの内容 SPC1A1 SPC1B1 SPC2A1 SPC2B1 SPV1A1 SPV2A1 Aテストの頭三文字が"SPC"であれば、テストAの処理を、違う場合はテストBの処理を 行いたいのですが、すべてテストBの処理を行ってしまいます。 書き方がおかしいのでしょうが、どのように修正を行えばよろしいのでしょうか? %の使い方がいまいちわかりずらく困っています。 DOSの文法等、わかりやすいHP等あれば合わせて教えていただけませんでしょうか? 特に、例の構文がわかりやすく解説つきで書かれているものがあれば助かるのですが。 いろいろバッチファイルを作成していきたいのですが、なかなか例文つきのHPが 見つからなくて。 よろしくお願いいたします。 環境:Win2008serverR2

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

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.2

まず、for文を複文(複数行を括弧でくくる書き方)で記載する場合、%変数名% はfor文のループに関係なく、 ループが始まる前に変数の内容に置き換えられてから実行されてしまうことをご理解ください。 したがって、変化する%%Jを環境変数に代入して、if文で比較するような書き方はたいがいうまくいきません。 setlocal ENABLEDELAYEDEXPANSION による環境変数の遅延展開を使うか、以下のように call 文で サブルーチンを呼び出す書き方をおすすめします。以下はcall文を使った例です。 同時にIF文の比較の細かいところを直しました。 FOR /F "delims=" %%J IN (A.TXT) DO call :sub %%J exit /b :sub SET ANS_SET=%1 SET ANS_VAL=%ANS_SET:~0,3% IF "%ANS_VAL%"=="SPC" ( ECHO テストA >> test.txt ) else ( ECHO テストB >> test.txt ) goto :EOF

doragon77
質問者

補足

ご回答ありがとうございました。 実は、この処理には続きがあり、テストAの処理においても、A.txtの内容により、 それぞれの処理を行いたいのです。 今度は頭四文字で処理を分けたつつ、一つ前の処理をテストAの処理を終了時に逆さまに 処理を閉じていきたいのです。 上記のsub内のテストAの処理手順は下記のとおりとなります。 (1)1レコード目を読み、テストA1を処理する。 (2)2レコード目を読み、一件前と頭4文字が同じなので、テストA1の処理をする。 (3)3レコード目を読み、一件前と頭4文字が違うので、テストA2の処理をする。  続けてテストA3の処理を行うのですが、この時、先に2レコード目の処理を終了する処理をし、  その後、1レコード目の処理を終了する処理を行います。 (4)1レコードと2レコードの処理が終了したので、3レコード目の処理のテストA1の処理を  行います。 (5)頭4文字が同じ場合は上記のような処理を繰り返します。 (6)頭の3文字が違う場合はテストBの処理を行います。 なかなか文章では説明しずらいのですが。。。 ややこしい質問ですいません。

その他の回答 (1)

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

まず最初に…、内容については、全く考慮していません。 で、 > IF %ANS_SET% == "SPC" ( ANS_VAL は何のためにあるの?

関連するQ&A

  • DOSバッチでUNIXテキストファイルの文字列置換

    お世話になります。 早速ですが、 「DOSバッチでテキストファイルの文字列置換を行うプログラム」がいろいろ紹介されていたので、 皆さんのプログラムを流用させていただき、勝手に継ぎ足したDOSバッチプログラムを以下の ように作りました。 このDOSバッチで置換されたテキストファイルに2つの問題が発生して困っています。 問題 1)UNIXテキストファイルの改行コードがLFからCR+LFに変ってしまう。     文字列置換した後にファイルサイズが大きくなっていたので発見しました。      問題 2)空白行がなくなる。     DOSプログラムでは、対応不可でしょうか?     やはり、sed,awk,WHS,power shell を使わないと解決しませんか? -(DOSプログラム f0.bat)------------------------------------------------------ ::** @echo off setlocal ENABLEDELAYEDEXPANSION set fname=%1 copy /b %fname% org >nul type nul >%fname% for /f "delims=" %%a in (org) do (set line=%%a&&set l=!line:abc=xxx!&&echo !l!>>%fname%) del org goto end :end exit /b 0 -(実行時の標準出力結果 list)----------------------------------------------- C:\>setlocal ENABLEDELAYEDEXPANSION C:\>set fname=t22.txt C:\>copy /b t22.txt org 1>nul C:\>type nul 1>t22.txt C:\>for /F "delims=" %a in (org) do (set line=%a && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=J0000000 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=HHH && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=519 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.98302 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.016114 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=0 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=abc && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>del org C:\>goto end C:\>exit /b 0 --(置換前 t22.org LF改行コード)-------------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 abc --(置換後 t22.txt CR+LF改行コード)----------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 xxxx ------------------------------------------ 皆さんのご意見、ご指導をお待ちしてます。

  • 終了コード errorlevel の考え方について

    こんばんは。 OSはWindowsXP Proを使っています。 テキストファイルに書いてある値を 終了コードにするバッチファイルを作成しました。 以下の2ファイルを同じディレクトリに保存します。 test.txt ┌--------┐   1 └--------┘ test.bat ┌---------------------------------------┐   @echo off   find "0" test.txt   if not errorlevel 1 exit /b 0   find "1" test.txt   if not errorlevel 1 exit /b 1   echo テキストは0~1の値ではありません。   exit /b 2 └---------------------------------------┘ この状態で次のように実行します (1) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT 1 (2) C:\>echo %errorlevel% 1 (3) C:\>set errorlevel=0 (4) C:\>echo %errorlevel% 0 ※ここでtest.txtの中の数字を2にします。 (5) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT テキストは0~1の値ではありません。 (6) C:\>echo %errorlevel% 0 (7) C:\>set errorlevel= (8) C:\>echo %errorlevel% 2 となります。 (2)の結果から、(1)で実行した「exit /b 1」でerrorlevelに1が格納されることが判ります。 しかし、(6)の結果から、(3)で実行した「set errorlevel=0」が (5)で実行した「exit /b 2」より優先されていることが判ります。 しかし(7)でerrorlevelの値を消去したように思われますが、 (8)の結果から、(3)のセットを消去しつつ(5)で実行した「exit /b 2」を記憶しているように見えます。 この挙動について、どのように理解すれば良いのでしょうか。 また「exit /b ○」と「set errorlevel=○」でセットする違いについて教えて頂ければと思います。 お願いします。

  • コマンドプロンプトでわからないことがあります

    例えばtxtファイルをドロップするとある動作をするバッチファイルAがあります。 特定のアドレスにあるtxtをドロップせずにAの操作を実行出来るバッチファイルBを、 Aのバッチを呼び出す形で作りたいです。 パッチファイルBを下のような感じで書いてみました。 ---------------------------------------- set BAT=Aのbatファイルのパス set TXT=C:\*.txt call %BAT% %TXT% ---------------------------------------- これでC直下にある全てtxtはAのバッチファイルである動作をするだろうと思ったのですが、 Aバッチファイルには『C:\*.txt』とそのまま読み込まれてしまいました。 *がワイルドカードとして使われていない感じです。 なぜでしょう?どうしたらいいでしょうか。

  • DOSコマンドバッチのFOR文の記述

    FOR文で以下のように記述しています。 SET FILENAME=aaa.txt FOR /F "tokens=1,2" %%i IN (revs.txt) DO SET FILENAME=%%i-%%j.txt & echo %FILENAME% echoで直前でSETした値を表示したいのですが、どうしても変化しません。(aaa.txtのまま) ※%i,%jには正しく値が設定されています。 以下を教えてください。 ・FILENAMEに値を設定する方法 ・コマンドが長い場合に改行する方法(もしあれば) よろしくお願いします

  • DOSのIF文でつまづいています

    DOSのプログラムでつまづいています。 test.batの中身 ************************************************ if %1==start goto start else if %1==stop goto stop else goto error :start rem スタート処理 echo start%1 > test.txt :stop rem ストップ処理 echo stop%1 > test.txt :error rem エラー処理 echo error%1 > test.txt exit ************************************************* うまく処理できる方法を教えてください。

  • ファイルのバッチ処理について

    バッチ処理を勉強しているところです。 ひとつの問題が解決できていないので、わかるひとは教えて もらえませんか? C:\bom.txtがあって、C:\temp\a.txtとC:\temp\d.txt, C:\temp\a\a.txt と C:¥temp\b\e.txtもあります。 for でC:\bom.txtファイルとほかのファイルと再帰的に結合して、 ファイル名はそのままにしたいですが、 @set bomfilepath=C:\ 考えているバッチは以下のようになるが、失敗しました。 for /R %1 %%f in (*.*) do @( @rem echo %%f call copy /B %bomfilepath%bom.txt+%%f %%ftemp call del /Q %%f ren %%ftemp %%f ) 原因はどこですか?

  • バッチファイルで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" ・・・ としたいのですが各行のつなぎの記号?がわかりません。 ご存知の方、よろしくお願いいたします。

  • バッチ処理 特定ファイルを除く削除

    環境:XP pro SP3 「test.txt」を基本ファイルとして残しておき、 変数を使って「test20090401.txt」というように、 バッチ処理をした日付が名前に入るように毎日自動コピー を作成しまして、加えて、8日目以降 1週間前の ファイルを自動削除したいのですが、基本の「test.txt」 は残しておきたいのです。 以下の処理だと「test.txt」まで削除されてしまうのですが、 他フォルダへの移動退避以外に「test.txt」を残し、 1週間前のファイルを削除する方法をご教授頂きたく お願い致します。 set yyyymmdd=%date:~-10% set yyyymmdd=%yyyymmdd:/=% set LOG_COUNT_LIMIT=7 cd c:\temp copy test.txt test%yyyymmdd%.txt for /f "skip=%LOG_COUNT_LIMIT%" %%a in ('dir /b /o-n *.txt') do (del %%a)

  • DOSプロンプト 特殊文字の出力

    はじめまして DOSプロンプトでバッチを組もうとしているのですが、 リダイレクトの>の文字をリダイレクトで別ファイルに出力したいのですがうまくいきません。 通常文字として認識するにはどうすればよいのでしょうか? ご教授願います。 イメージ echo test>test>> output.txt ↓ output.txtに出力したい文字 test>test

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

    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

専門家に質問してみよう