
こんばんは。
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=○」でセットする違いについて教えて頂ければと思います。
お願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
ERRORLEVELは、一般の環境変数と異なり、SET で値を代入してはいけません。
(参考: set /? で表示される最終ページ)SET を使うと一般の環境変数となってしまい、次にSETするまで値は変わりません。コマンドの実行結果と切り離されると言うことです。
%ERRORLEVEL%は、環境変数ERRORLEVELがセットされていないときに限って、直前のコマンドの実行結果ステータスに置換されます。
(7)によってアンセットされたので、再びコマンド実行結果を表すようになりました(8)。
環境変数ERRORLEVELに値がセットされているかどうかは、SET ERRORLEVELでわかります。つまり、%ERRORLEVEL%をコマンドの実行結果として使うためには、
C:\>set errorlevel
環境変数 errorlevel が定義されていません
という状態でないといけません。
%ERRORLEVEL%をゼロにしたければ、
C:\>cd
とかの正常終了するコマンドを打てばいいです(ECHOは除く)。
回答ありがとうございます。
「一般の環境変数」という考え方が判りませんが、変数と考えれば良いのでしょうか。
「set /?」で
--------------------------------------------------------------
コマンド拡張機能が有効な場合、
SETによって表示される変数の一覧には現れない
いくつかの動的な環境変数があります。
これらの変数の値は、変数の値が展開されるときに動的に計算されます。
ユーザーがこれらの名前の変数を明示的に定義する場合、
その定義は下記の動的な定義を無効にします。
--------------------------------------------------------------
とありました。
その文章以下に書いてある%CD%~%CMDCMDLINE%はSETで値を設定してはいけないということですね。
・ERRORLEVELの値は実行結果により、動的に値が変更される。
・SETで値を代入すると、動的に設定された値よりSETで代入した値を優先して参照する。
という理解です。
「set errorlevel=○」で設定した値を消去するには「set errorlevel=」
「exit /b ○」で設定した値を消去するには「C:\>cd」
を行えばよいのですね。
cd以外でも
C:\>dir
を実行した所、「exit /b ○」の終了コードが無効になったことを確認しました。
No.1
- 回答日時:
set errorlevel=○
とすると環境変数errorlevelの値がセットされる。
exit /b ○
とするとシステム変数errorlevelの値がセットされる。これは自動的に環境変数errorlevelにもセットされる。
echo %errorlevel%
としたとき環境変数errorlevelがセットされていればその値を書く。セットされていなければシステム変数errorlevelその値を書く。
set errorlevel=
としたとき消去されるのは環境変数errorlevelの値である。
この回答への補足
回答ありがとうございます。
「環境変数」と「システム変数」という違いがあるのですね。
どのような違いがあるのか、今の私にはまだ判らないのですが。
「コントロールパネル」→「システム」→「詳細設定」→「環境変数」→「システム環境変数」
に「変数名」「変数値」を設定した所、回答者様がおっしゃる所の環境変数の値になりました。
「echo %errorlevel%」で
環境変数がセットされていればその値を、セットされていなければシステム変数を表示する、
は理解しました。
一つだけ腑に落ちないのが
(4)で環境変数に0がセットされましたが、
(6)で0を表示しているということは
(5)ではシステム変数に2をセットしているが、環境変数には2をセットしていないことになります。
このことが
>exit /b ○
>とするとシステム変数errorlevelの値がセットされる。これは自動的に環境変数errorlevelにもセットされる。
に矛盾していると考えました。お言葉を返すようですみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP php エラー 2 2022/10/23 16:43
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
数学、プログラミング、物理、...
-
画像生成AIのプロンプトの作り...
-
Python... 環境設定 初心者です...
-
OS入ってる機器のソフト・アプ...
-
pip --versionがエラーになる
-
パイソンのソースコードをChatG...
-
pythonの実行に関する質問
-
Python 3.12.2 か一番最新のパ...
-
CSVファイルの複数行削除
-
Webサイト内に埋め込んだmp4動...
-
ExcelVBAでFormulaR1C1を列範囲...
-
Pythonのエラーメッセージをコ...
-
ネットワークフォルダの中身を...
-
Pythonで仮想通貨の自動売買が...
-
AIの登場でプログラマーたちが...
-
Google ColaboでGUI作成
-
Pythonについて。
-
HTMLソースが表示のページのも...
-
MOVEコマンドでサブフォルダー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
CSVファイルの複数行削除
-
OS入ってる機器のソフト・アプ...
-
Python 3.12.2 か一番最新のパ...
-
pythonの実行に関する質問
-
パイソンのソースコードをChatG...
-
画像生成AIのプロンプトの作り...
-
数学、プログラミング、物理、...
-
pip --versionがエラーになる
-
Google ColaboでGUI作成
-
Python... 環境設定 初心者です...
-
HTMLソースが表示のページのも...
-
ネットワークフォルダの中身を...
-
MOVEコマンドでサブフォルダー...
-
google Colabでmatplotlibの描...
-
VBAでパワーシェルを実行したい...
-
Pythonでの文字列からfloatへの...
-
Webサイト内に埋め込んだmp4動...
-
初心者powershellのPS1ファイル...
-
pythonについて(初心者です)
おすすめ情報