Windows では、バッチ ファイルの実行時に渡される引数にどのようにアクセスしますか?
たとえば、 という名前のプログラムがあるとしhello.bat
ます。Windows コマンド ラインで入力するときに、引数として渡されたhello -a
ことをプログラムに知らせるにはどうすればよいですか?-a
Windows では、バッチ ファイルの実行時に渡される引数にどのようにアクセスしますか?
たとえば、 という名前のプログラムがあるとしhello.bat
ます。Windows コマンド ラインで入力するときに、引数として渡されたhello -a
ことをプログラムに知らせるにはどうすればよいですか?-a
%1
他の人がすでに言ったように、コマンドラインを介して渡されたパラメーターは、への表記を使用してバッチファイルでアクセスできます%9
。使用できる他の 2 つのトークンもあります。
%0
は、コマンド ラインで指定された実行可能 (バッチ ファイル) 名です。%*
コマンドラインで指定されたすべてのパラメーターです。これは、パラメーターを別のプログラムに転送する場合に非常に役立ちます。パラメータへのアクセス方法だけでなく、知っておくべき重要なテクニックもたくさんあります。
これはIF "%~1"==""
、引数がまったく渡されなかった場合にのみ true となる のような構造で行われます。の値から周囲の引用符を削除するチルダ文字に注意してください%1
。チルダがないと、その値に二重引用符が含まれていると、構文エラーの可能性を含め、予期しない結果が得られます。
9 つ以上の引数にアクセスする必要がある場合は、コマンドを使用する必要がありますSHIFT
。このコマンドは、すべての引数の値を 1 か所シフトします。つまり%0
、 の値、の値、などを取得します。10 番目の引数 (存在する場合) の値を取得します。これは、呼び出す前にどの変数からも使用できませんでした(入力コマンドを使用してオプションを追加します)。%1
%1
%2
%9
SHIFT
SHIFT /?
SHIFT
パラメータを特定の順序で表示する必要なく簡単に処理したい場合にも役立ちます。たとえば、スクリプトはフラグ-a
を-b
任意の順序で認識できます。このような場合にコマンド ラインを解析する良い方法は次のとおりです。
:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!
このスキームにより、非常に複雑なコマンドラインを非常識にならずに解析できます。
ファイル名を表すパラメーターの場合、シェルは、他の方法ではアクセスできないファイルの操作に関連する多くの機能を提供します。この機能には、 で始まるコンストラクトを使用してアクセスします%~
。
たとえば、引数として渡されたファイルのサイズを取得するには、次のようにします。
ECHO %~z1
バッチファイルが起動されたディレクトリのパスを取得するには(非常に便利です!)、次を使用できます
ECHO %~dp0
CALL /?
コマンド プロンプトに入力すると、これらの機能の全範囲を表示できます。
バッチ ファイルでのパラメータの使用: %0 および %9
%0
バッチ ファイルは、 toというトークンを使用してパラメーターとして渡された単語を参照できます%9
。
%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.
コマンドラインで渡されるパラメーターは英数字で、スペースで区切られている必要があります。%0
は呼び出されたときのプログラム名であるため、DOS では、ブート%0
時に開始された場合、AUTOEXEC.BAT は空になります。
例:
という名前のバッチ ファイルに次のコマンドを入力しますmybatch.bat
。
@echo off
@echo hello %1 %2
pause
次のようにバッチ ファイルを呼び出すと、次のようmybatch john billy
に出力されます。
hello john billy
バッチ ファイルの 9 個を超えるパラメーターを取得するには、%* を使用します。
パーセント スター トークン%*
は、「残りのパラメーター」を意味します。ここで定義されているように、for ループを使用してそれらを取得できます。
http://www.robvanderwoude.com/parameters.php
バッチ パラメータの区切り記号に関する注意事項
コマンド ライン パラメータの一部の文字は、バッチ ファイルによって無視されます。これは、DOS のバージョン、「エスケープ」されているかどうか、コマンド ラインでの位置によって異なります。
commas (",") are replaced by spaces, unless they are part of a string in
double quotes
semicolons (";") are replaced by spaces, unless they are part of a string in
double quotes
"=" characters are sometimes replaced by spaces, not if they are part of a
string in double quotes
the first forward slash ("/") is replaced by a space only if it immediately
follows the command, without a leading space
multiple spaces are replaced by a single space, unless they are part of a
string in double quotes
tabs are replaced by a single space
leading spaces before the first command line argument are ignored
@Jon の:parse
/:endparse
スキームは素晴らしいスタートであり、彼は最初のパスに感謝していますが、Windows の厄介なバッチ システムがあなたを簡単に解放してくれると思うなら… まあ、私の友人、あなたはショックを受けています。私は一日中この悪魔と過ごしてきました。多くの苦痛を伴う研究と実験の後、私は最終的に現実のユーティリティに実行可能な何かを管理しました.
utility を実装したいとしましょうfoobar
。初期コマンドが必要です。オプション--foo
の値を取るオプションのパラメーターがあります(もちろん、別のパラメーターにすることはできません)。値が欠落している場合、デフォルトは になります。また、必須の値を取るオプションのパラメーターもあります。最後に、値が許可されていないフラグを取ることができます。ああ、これらのパラメーターは任意の順序で指定できます。default
--bar
--baz
つまり、次のようになります。
foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]
複雑?いいえ、それは実際のユーティリティのかなり典型的なようです。(git
誰か?)
さらに苦労することなく、ここに解決策があります:
@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson
SET CMD=%~1
IF "%CMD%" == "" (
GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=
SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
SHIFT
IF NOT "%ARG%" == "" (
IF NOT "%ARG:~0,2%" == "--" (
SET FOO=%ARG%
SHIFT
) ELSE (
SET FOO=%DEFAULT_FOO%
)
) ELSE (
SET FOO=%DEFAULT_FOO%
)
) ELSE IF "%PARAM%" == "--bar" (
SHIFT
IF NOT "%ARG%" == "" (
SET BAR=%ARG%
SHIFT
) ELSE (
ECHO Missing bar value. 1>&2
ECHO:
GOTO usage
)
) ELSE IF "%PARAM%" == "--baz" (
SHIFT
SET BAZ=true
) ELSE IF "%PARAM%" == "" (
GOTO endargs
) ELSE (
ECHO Unrecognized option %1. 1>&2
ECHO:
GOTO usage
)
GOTO args
:endargs
ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
ECHO Baz
)
REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof
:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1
はい、それは本当に悪いです。https://stackoverflow.com/a/50653047/421049にある同様の投稿を参照してください。ここでは、ロジックで何が起こっているか、および特定の構造を使用した理由についてさらに分析しています。
恐ろしいです。そのほとんどは今日学ばなければなりませんでした。そして痛かった。
バッチ ファイルは、テキストを割り当てる変数である限り、プログラムの後にテキストを自動的に渡します。それらは送信された順に渡されます。たとえば、%1 は、プログラムが呼び出された後に送信される最初の文字列になります。
Hello.bat があり、内容が次の場合:
@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause
そして、コマンドでバッチを呼び出します
hello.bat APerson241 %date%
次のメッセージが返されます。
こんにちは、APerson241 このバッチ ファイルを実行していただきありがとうございます (01/11/2013)
変数を使用します。つまり、.BAT
変数と呼び出さ%0
れます%9