FOR文内でサブルーチンをCALLした際のERRORLEVELの取得

このQ&Aのポイント
  • FOR文内でサブルーチンをCALLする際のERRORLEVELの取得方法がわからない
  • バッチファイル内のFOR文でサブルーチンをCALLした際、ERRORLEVELがうまく取得できない
  • ファイルをコピーしてFOR文で処理を繰り返す際、サブルーチンのERRORLEVELを取得できない
回答を見る
  • ベストアンサー

FOR文内でサブルーチンをCALLした際の、ERRORLEVELの取得

ファイルをコピーしてからFOR文により6回処理を繰り返すような バッチファイルを作成しようと思っています。 そのFOR文内でコールしたサブルーチンのERRORLEVELがうまく取得できません。ファイルコピーをしなければ値が取得できるのですが。。。 何が 原因なのか皆目見当つかずで行き詰ってしまいました。 どなたか 教えてください。 宜しく御願いします。 @echo off copy test.txt test.txt.bak for /L %%A in (0,1,5) do ( call :test echo 戻り値:%ERRORLEVEL% ) :test exit /b 99

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

  • ベストアンサー
  • nidoking
  • ベストアンサー率69% (18/26)
回答No.1

環境変数は、一行ごとに解釈されるようです。 %ERRORLEVEL%も同様です。 for ( ... )は、一文とみなされ、for文内でERROELEVELが変わっていても、 echo文の%ERRORLEVEL%は、for文実行前の値となってしまいます。 実際には、ERRORLEVELはセットされており、 if errorlevel では、ちゃんと機能します。 実行中に変更される環境変数を使用するためには、 遅延環境変数という機能があります。 cmd /v:onとしてコマンドプロンプトを起動後、 変数を、!ERROELEVEL! と指定することで、実行中に変更された環境変数を使用することができます。 以上

kazuki06
質問者

お礼

nidokingさん 回答ありがとうございました。 cmd /v:onはうまく使えなかったので setlocal enabledelayedexpansion ~ endlocal を使用しましたが、お陰さまで解決出来ました。 遅延環境変数という機能があるのですね。知りませんでした。

関連するQ&A

  • bat サブルーチンのERRORLEVELについて

    バッチのサブルーチンのERRORLEVELについて質問です。 サブルーチン内でERRORLEVELを返すコマンドを実行したいのですが、 親ルーチンにそのERRORLEVELを共有したくない場合、何か方法はありますか? ============================================================ [1.bat] SET MSG1="NOTFOUND" SET MSG2="found!" echo %ERRORLEVEL% FIND %MSG1% 2.bat REM %ERRORLEVEL%は1に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% FIND %MSG2% 2.bat REM %ERRORLEVEL%は0に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% REM %ERRORLEVEL%は0であって欲しいが0に pause EXIT 1 :LOG FIND %MSG1% hogehoge.log REM %ERRORLEVEL%は1に ============================================================ [2.bat] found! ============================================================ [hogehoge.log] 空 ============================================================

  • 実行結果を戻り値で取得したい

    MS-DOSバッチの実行結果を文字列で取得したいです。 イメージ例としては、下記のようなバッチ2つがあり、 バッチAを起動します。そうすると実行結果の戻り値として 「TEST」という文字列が取得できたら良いです。  ※下記例では「ERRORLEVEL」に入っているようなイメージです。 しかしながら、ERRORLELVEに格納できるのは数値のみの為、 エラーになってしまいます。 どうすれば、実行結果を戻り値で取得できるでしょうか? お手数ですが、MS-DOSで不可能な場合、VBScriptやWSHでも かまいませんので、処理をキックしてその戻り値を文字列で取得する方法を お教えください。お願いいたします。 -------------------------------- 例 【バッチA】 call バッチB echo %ERRORLEVEL% 【バッチB】 exit /b "TEST" -------------------------------- と実行し

  • バッチコマンドで改名

    環境:Windows 2000Pro 現在、拡張子を変換するのに以下のような処理をしています。 1)変換対象ファイルの一覧をバッチ・ファイルとして保存。   // bak_lst.cmd ----------------------------    ren E:\Test\Sample.txt Sample.bak    ren E:\Test\Sample02.txt Sample02.bak             :   // bak_lst.cmd -END ----------------------- 2)起動用バッチ・ファイル(to_bak.cmd)からCALL文で(1)にて作成したバッチ・ファイルを呼び出す。   // to_bak.cmd ---------------    @echo off    call E:\Test\bak_lst.cmd   // to_bak.cmd -END ---------- ■ これを、 1)変換対象ファイルの一覧は、ファイル名のみの羅列でテキストファイルとして保存。   // bak_lst.txt ------------    E:\Test\Sample.txt    E:\Test\Sample02.txt         :   // bak_lst.txt -END ------- 2)バッチ・ファイルで(1)にて作成したテキストファイルを読み込んで拡張子の変換を実行。   //???.cmd: for %%f in (E:\Test\list.txt) do ren ・・・   // 結果 -------------------    E:\Test\Sample.bak    E:\Test\Sample02.bak         :   // 結果 -END -------------- と言うように、出来るでしょうか? 厚かましい質問ですが、よろしくお願いいたします。

  • Windowsのバッチについて

    お世話になります。 Windowsのバッチについてアドバイスをいただけますでしょうか。 ある文字列の書かれているファイルを1つ作成して「拡張子のあるもの」、「無いもの」2種類を作成したいと考えています。 例) 拡張子の無いもの:test01~test3000 拡張子のあるもの:text01.txt~text3000.txt 3000個と大量のファイルが必要なためechoとcopyコマンドを使って次のように指定しましたが、 ■sample.batの中身 ========================== echo testdata > test01 echo testdata > test02 echo testdata > test03 echo testdata > test04 echo testdata > test05 ~中略 copy test01 > test01.txt copy test02 > test02.txt copy test03 > test03.txt copy test04 > test04.txt copy test05 > test05.txt ~以下省略 ========================== 実際に作成された拡張子”.txt”の方を見てみると 次のように記載されており正しくファイルをコピーできません。 ■test01.txt~test05.txtの中身 =================================================== ファイルを同じファイルにコピーすることはできません。 0 個のファイルをコピーしました。 =================================================== どのようにすればファイルコピーを正しく行うことが出来ますでしょうか。 また、この方法では実際にbatファイルの編集に時間がかかってしまうためあまり実用的ではありません。 もし、他に良い方法があればアドバイスをいただけますと幸いです。

  • 終了コード 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=○」でセットする違いについて教えて頂ければと思います。 お願いします。

  • バッチファイル 戻り値

    いつも大変御世話になっております。 WindowsVISTA環境で以下バッチ【ABC.bat】が稼動します。 "ABC.bat"------------------------------------------------- @ECHO ON set bat_name="ABC.bat" call DEF.bat echo %bat_name% は戻り値 %ERRORLEVEL% を受け取りました。 "ABC.bat"------------------------------------------------- 上記バッチの構文では以下バッチDEF.batを起動させ、ERRORLEVELを取得させます。 "DEF.bat"------------------------------------------------- @ECHO ON set bat_name="DEF.bat" exit /b 10 "DEF.bat"------------------------------------------------- 実行結果は予想していたものと違っていました。 予想していた実行結果 : "ABC.bat" は戻り値 10 を受け取りました。 実際の実行結果     : "DEF.bat" は戻り値 10 を受け取りました。】 %ERRORLEVEL%のみを取得したかったのですが DEF.bat の set bat_name="DEF.bat" までも取得してしまいました。 bat_name はどうしても "ABC.bat"とCALLする側の変数を使用したいのですが 制御は難しいでしょうか? echo %bat_name% は戻り値 %ERRORLEVEL% を受け取りました。 の直前に 再度 set bat_name="ABC.bat" と記述しなければダメでしょうか? 尚、都合上、ECHO文と変数名は変えたくありません。 もしご存知の方がいらっしゃるようでしたら、お手数ですが 実現可能かどうかをご回答願いますでしょうか? 以上、何卒宜しくお願い致します。

  • バッチファイルからVBのEXEの戻り値

    いつもお世話になっています。 タイトルの通りなのですが、下記のようなバッチファイルからexeを起動し、exeがエラー終了した場合などに バッチファイルのERRORLEVELにエラーデータ(1)を入れたいのですが それを設定するのはいったいどうやったりいいのかがさっぱりでして…。f(- -; @echo off SETLOCAL call Project1.exe %ERRORLEVEL% echo %ERRORLEVEL% pause exeでのエラーが発生するタイミングなどは特に指定はないので、戻り値の設定の仕方を教えていただきたいです。 言葉足らずや説明不足など補足要求もお待ちしています。 お願いいたします。

  • バッチファイル ワイルドカード処理確認方法

    お世話になります。 WindowsXP環境にて下記のバッチファイルがあります。 コード------------------------------- COPY D:\in\L*.txt E:\out1\L*.txt MOVE D:\in\L*.txt F:\out2\P*.txt コード------------------------------- こういうワイルドカードを使用したコピー・移動処理がうまくいったかどうかを 確認する方法として、if %errorlevel%~ で一番無難なのでしょうか? if %errorlevel%~を追加するのであれば、 上記コードだと・・・ コピー処理後に if %errorlevel%~ そして問題無ければ今度は移動処理・・・ さらにif %errorlevel%~ それともForとかでまわさないと確実な確認が出来ないのでしょうか? Forだとコードが増えるので極力避けたいですが・・・。 ご存知の方がいれば、ご教授願います。 宜しくお願い致します。

  • バッチファイルのfor文を使ってファイルサイズをMbyteで表したい。

    バッチファイルのfor文を使ってファイルサイズをMbyteで表したい。(WindowsXP) for文を使って、フォルダー内のファイル名とサイズ一覧を作ろうとしています。 1)for %%i in (c:\test\*.*) do echo %%i %%~zi>> c:\test\testfiles.txt で一応はできたのですが、これではファイルサイズがわかりにくいので、メガバイト単位にしたいのです。(だいたいわかればいいので1024で割るとかはしない) 2)for %%i in (c:\test\*.*) do echo %%i %%~zi/1000000>> c:\test\testfiles.txt 3)for %%i in (c:\test\*.*) do set /a x=%%~zi/1000000 & echo %%i %%x>> c:\test\testfiles.txt としてもうまくいきません。 %%~ziが数値でなく文字列のため、だと思うのですが、3)は%の付け方とかも間違ってそう。 どう書けばメガバイト単位で一覧を出せるでしょうか? あれ? 4)for %%i in (c:\test\* ) do if %%~zi GEQ 1000000 echo %%i>> c:\test\testfiles.txt とすれば1メガ以上のファイル名一覧が出ますね。 ということは%%~ziは数値なのか。  どなたか、どこが間違っているのか教えていただけないでしょうか

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

    バッチファイルについて バッチファイルの勉強をしておりますが、以下のバッチで 分からない箇所があります。 @echo off copy C:\bin\set.txt set.txt | find /v "コピー" echo ユーザー名を入力してください echo 入力後、Ctrlキーを押しながらZキーを押した後、Enterキー copy con inp.txt | find /v "コピー" copy set.txt+inp.txt setinp.bat | find "○○" call setinp.bat echo ユーザー名は%INP%と入力されました! del setinp.bat set.txt inp.txt <<不明箇所>> まず、C:\bin\set.txt』は set INP= とだけ書いたファイルです。 copy C:\bin\set.txt set.txt | find /v "コピー" ですが、|find /v"コピー"はなんのためにやっているのでしょうか?? find /vを調べてみると、指定した文字列を含まない行の内容をすべて画面に表示します。 と記載されていますが・・・・このバッチでは一体なぜ最初にいるのでしょう?? copy con inp.txt | find /v "コピー" ですが、コンソールから入力させた文字列をinp.txtに保存しているらしいのですが、 そのあとに、また、|find /v"コピー"がでてきますが、なぜでしょう??なにを したいのでしょう?? さらにまた、copy set.txt+inp.txt setinp.bat | find "○○"が出てきますが、 ここでなぜまた意味不明な、|find"○○"がでてくるのでしょう?? さらにさらに、バッチを実行してみると、set.txtの中身にはコンソールから 入力した文字は何も記載されていない、そして、inp.txtやsetinp.txtという テキストファイルも、どのフォルダにも出来ていません。 最後の行のdel setinp.bat set.txt inp.txtを消して実行してみても同じです。 なぜでしょう?? このバッチの動き、例としての意図が全く分かりません。。。。 この例題が悪すぎるのか、私の頭がわるすぎるのか・・・・ ちなみに、上記バッチは、http://www.geocities.co.jp/SiliconValley-SanJose/1227/batinput.html のサイトのものです。 どなたかご教授願います。。。一週間悩みましたが、まったく理解できない状態です。。。