175

Windows では、バッチ ファイルの実行時に渡される引数にどのようにアクセスしますか?

たとえば、 という名前のプログラムがあるとしhello.batます。Windows コマンド ラインで入力するときに、引数として渡されたhello -aことをプログラムに知らせるにはどうすればよいですか?-a

4

5 に答える 5

311

%1他の人がすでに言ったように、コマンドラインを介して渡されたパラメーターは、への表記を使用してバッチファイルでアクセスできます%9。使用できる他の 2 つのトークンもあります。

  • %0、コマンド ラインで指定された実行可能 (バッチ ファイル) 名です。
  • %*コマンドラインで指定されたすべてのパラメーターです。これは、パラメーターを別のプログラムに転送する場合に非常に役立ちます。

パラメータへのアクセス方法だけでなく、知っておくべき重要なテクニックもたくさんあります。

パラメータが渡されたかどうかの確認

これはIF "%~1"==""、引数がまったく渡されなかった場合にのみ true となる のような構造で行われます。の値から周囲の引用符を削除するチルダ文字に注意してください%1。チルダがないと、その値に二重引用符が含まれていると、構文エラーの可能性を含め、予期しない結果が得られます。

9 つ以上の引数を処理する (または単に作業を楽にする)

9 つ以上の引数にアクセスする必要がある場合は、コマンドを使用する必要がありますSHIFT。このコマンドは、すべての引数の値を 1 か所シフトします。つまり%0、 の値、の値、などを取得します。10 番目の引数 (存在する場合) の値を取得します。これは、呼び出す前にどの変数からも使用できませんでした(入力コマンドを使用してオプションを追加します)。%1%1%2%9SHIFTSHIFT /?

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 /?コマンド プロンプトに入力すると、これらの機能の全範囲を表示できます。

于 2013-01-12T22:46:27.300 に答える
59

バッチ ファイルでのパラメータの使用: %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
于 2013-01-11T21:03:06.737 に答える
10

@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にある同様の投稿を参照してください。ここでは、ロジックで何が起こっているか、および特定の構造を使用した理由についてさらに分析しています。

恐ろしいです。そのほとんどは今日学ばなければなりませんでした。そして痛かった。

于 2018-06-02T02:29:25.687 に答える
5

バッチ ファイルは、テキストを割り当てる変数である限り、プログラムの後にテキストを自動的に渡します。それらは送信された順に渡されます。たとえば、%1 は、プログラムが呼び出された後に送信される最初の文字列になります。

Hello.bat があり、内容が次の場合:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

そして、コマンドでバッチを呼び出します

hello.bat APerson241 %date%

次のメッセージが返されます。

こんにちは、APerson241 このバッチ ファイルを実行していただきありがとうございます (01/11/2013)

于 2013-01-11T21:06:24.170 に答える
3

変数を使用します。つまり、.BAT変数と呼び出さ%0れます%9

于 2013-01-11T21:02:51.577 に答える