1289

ID とパスワードをファイルにハードコーディングするのではなく、実行時にバッチ ファイルに渡す必要があります。

コマンドラインは次のようになります。

test.cmd admin P@55w0rd > test-log.txt
4

20 に答える 20

1152

もう1つの便利なヒントは、%*「すべて」を意味するために使用することです。例えば:

echo off
set arg1=%1
set arg2=%2
shift
shift
fake-command /u %arg1% /p %arg2% %*

実行する場合:

test-command admin password foo bar

上記のバッチファイルが実行されます。

fake-command /u admin /p password admin password foo bar

構文が少し間違っているかもしれませんが、これが一般的な考え方です。

于 2008-08-25T19:41:55.107 に答える
327

これが私がそれをした方法です:

@fake-command /u %1 /p %2

コマンドは次のようになります。

test.cmd admin P@55w0rd > test-log.txt

これ%1は最初のパラメーターに適用されます%2(そしてここで注意が必要な部分) が 2 番目のパラメーターに適用されます。この方法で最大 9 個のパラメーターを渡すことができます。

于 2008-09-18T12:26:52.253 に答える
162

不足しているパラメーターをインテリジェントに処理したい場合は、次のようにすることができます。

IF %1.==. GOTO No1
IF %2.==. GOTO No2
... do stuff...
GOTO End1

:No1
  ECHO No param 1
GOTO End1
:No2
  ECHO No param 2
GOTO End1

:End1
于 2008-08-25T20:03:34.587 に答える
96

バッチパラメータへのアクセスは、%1、%2、...%9、または%*を使用して簡単に行うことができますが
、コンテンツが単純な場合に限ります。

"&"^&エラーを発生させずに%1にアクセスすることはできないため、の ような複雑なコンテンツを簡単に作成する方法はありません。

set  var=%1
set "var=%1"
set  var=%~1
set "var=%~1"

線はに拡大します

set  var="&"&
set "var="&"&"
set  var="&"&
set "var="&"&"

&そして、1つが引用符の外にあるため、各行は失敗します。

これは、一時ファイルからパラメータの注釈付きバージョンを読み取ることで解決できます。

@echo off
SETLOCAL DisableDelayedExpansion

SETLOCAL
for %%a in (1) do (
    set "prompt="
    echo on
    for %%b in (1) do rem * #%1#
    @echo off
) > param.txt
ENDLOCAL

for /F "delims=" %%L in (param.txt) do (
  set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'

秘訣は、ステートメントecho onの後に%1を有効にして展開することです()でも機能します。そのため、注意されているように、エラーを発生させることなくエコーすること もできます。rem%2 .. %*
"&"&

ただし、の出力をリダイレクトできるようにするにはecho on、2つのforループが必要です。

余分な文字* #は、のようなコンテンツに対して安全であるために使用されます/?(のヘルプが表示されますREM)。
または、行末のキャレット^は、。の後であっても、複数行の文字として機能する可能性がありremます。

次に、ファイルから出力されたremパラメーターを注意深く読み取ります。
FOR / Fは、遅延拡張をオフにして動作する必要があります。それ以外の場合、コンテンツは「!」で動作します。破壊されます。
の余分な文字を削除した後param1、あなたはそれを手に入れました。

また、安全に使用するparam1には、遅延拡張を有効にします。

于 2011-03-30T22:16:12.857 に答える
64

ええ、そしてギャングを使用する%%1ときのように、変数を使用することを忘れないでください。iffor

double を忘れると、%コマンド ライン引数 (おそらく null) を代入することになり、かなり紛らわしいエラー メッセージが表示されます。

于 2008-08-25T18:16:32.957 に答える
55

複雑にする必要はありません。コマンド %1 %2 パラメータです。たとえば、

@echo off

xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z

echo copied %1 to %2

pause

「一時停止」は、バッチ ファイルが何を行ったかを表示し、ANY キーが押されるのを待ちます。これを xx.bat として Windows フォルダーに保存します。

使用するには、次のように入力します。

xx c:\f\30\*.* f:\sites\30

このバッチ ファイルは、新しいファイルのみをコピーするなど、必要なすべてのパラメーターを処理します。私は Windows 以前から使用しています。ファイルがコピーされているときにファイルの名前を確認したい場合は、Qパラメーターを省略してください。

于 2012-04-18T23:46:40.137 に答える
37

バッチファイルで

set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%

%1%2それぞれ、1 番目と 2 番目の引数の値を返します。

そしてコマンドラインで、引数を渡します

Directory> batchFileName admin P@55w0rd 

出力は

admin
P@55w0rd
于 2019-10-18T09:24:24.993 に答える
25

これを簡単にしましょう。

これが .cmd ファイルです。

@echo off
rem this file is named echo_3params.cmd
echo %1
echo %2
echo %3
set v1=%1
set v2=%2
set v3=%3
echo v1 equals %v1%
echo v2 equals %v2%
echo v3 equals %v3%

コマンドラインからの 3 つの呼び出しを次に示します。

C:\Users\joeco>echo_3params 1abc 2 def  3 ghi
1abc
2
def
v1 equals 1abc
v2 equals 2
v3 equals def

C:\Users\joeco>echo_3params 1abc "2 def"  "3 ghi"
1abc
"2 def"
"3 ghi"
v1 equals 1abc
v2 equals "2 def"
v3 equals "3 ghi"

C:\Users\joeco>echo_3params 1abc '2 def'  "3 ghi"
1abc
'2
def'
v1 equals 1abc
v2 equals '2
v3 equals def'

C:\Users\joeco>
于 2015-12-31T17:59:14.327 に答える
22
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

これは、引用符で囲まれているかどうかに関係なく、バッチ パラメーター (%*) をループしてから、各パラメーターをエコーし​​ます。

于 2014-11-25T04:39:10.710 に答える
20

.bat関数 (または external ) として呼び出すことができ、すべての変数を現在の環境に配置する単純な read_params スクリプトを作成しました。call関数は元のパラメーターのコピーで編集されているため、元のパラメーターは変更されません。

たとえば、次のコマンドがあるとします。

myscript.bat some -random=43 extra -greeting="hello world" fluff

myscript.bat関数を呼び出した後に変数を使用できるようになります。

call :read_params %*

echo %random%
echo %greeting%

関数は次のとおりです。

:read_params
if not %1/==/ (
    if not "%__var%"=="" (
        if not "%__var:~0,1%"=="-" (
            endlocal
            goto read_params
        )
        endlocal & set %__var:~1%=%~1
    ) else (
        setlocal & set __var=%~1
    )
    shift
    goto read_params
)
exit /B

制限事項

  • などの値のない引数はロードできません-force。使用できます-force=trueが、値を持たないパラメーターのリストを事前に知らずに空の値を許可する方法は考えられません。

変更ログ

  • 2016/2/18
    • 遅延拡張は不要
    • -以前のパラメータを探すことで、他のコマンド ライン引数で動作するようになりました。
于 2016-02-17T00:24:54.997 に答える
16

皆さんとても複雑な回答をされていますが、実はとてもシンプルです。%1 %2 %3などは、ファイルに解析された引数です。%1は引数 1、%2は引数 2 などです。

したがって、これを含むバット スクリプトがあるとします。

@echo off
echo %1

バッチ スクリプトを実行するときは、次のように入力します。

C:> script.bat Hello

スクリプトは単にこれを出力します:

Hello

これは、名前や年齢など、スクリプト内の特定の変数に非常に役立ちます。したがって、次のようなスクリプトがあるとします。

@echo off
echo Your name is: %1
echo Your age is: %2

これを入力すると:

C:> script.bat Oliver 1000

私はこれの出力を取得します:

Your name is: Oliver
Your age is: 1000
于 2021-06-06T14:37:41.097 に答える
11

@Jon による他の場所の回答に触発されて、名前付きパラメーター、オプションの値、およびスイッチを抽出するためのより一般的なアルゴリズムを作成しました。

utility を実装したいとしましょうfoobar。初期コマンドが必要です。オプション--fooの値を取るオプションのパラメーターがあります(もちろん、別のパラメーターにすることはできません)。値が欠落している場合、デフォルトは になります。また、必須の値を取るオプションのパラメーターもあります。最後に、値が許可されていないフラグを取ることができます。ああ、これらのパラメーターは任意の順序で指定できます。default--bar--baz

つまり、次のようになります。

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

ここに解決策があります:

@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
  • SETLOCAL変数が呼び出し環境に逃げないように使用します。
  • SET FOO=誰かが呼び出し元の環境で変数を定義した場合に備えて、変数などを初期化することを忘れないでください。
  • %~1引用符を削除するために使用します。
  • Use IF "%ARG%" == ""and not IF [%ARG%] == []because[]don't play は、スペースで終わる値を使用します。
  • ブロックSHIFT内であっても、などの現在の引数は、が解析されるときに決定されるため、更新されません。ブロック内でandを使用できますが、 . わかりやすくするために をブロックの最後に置くこともできますが、それは失われたり、人々を混乱させたりする可能性があります。したがって、「キャプチャ」してブロックの外に出すのが最善のようです。IF%~1IF%~1%~2IFSHIFTSHIFT%~1%~1
  • 別のパラメーターのオプション値の代わりにパラメーターを使用したくないため、 を確認する必要がありますIF NOT "%ARG:~0,2%" == "--"
  • いずれかのパラメーターを使用SHIFTする場合にのみ注意してください。
  • 重複したコードSET FOO=%DEFAULT_FOO%は残念ですが、代わりにブロックのIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%外側に を追加することもできます。IF NOT "%ARG%" == ""ただし、これはまだブロック内にあるためIF "%PARAM%" == "--foo"%FOO%ブロックに入る前に値が評価および設定されているため、パラメーターが存在することとが欠落していることの両方を検出することはできません。--foo%FOO%
  • ECHO Missing bar value. 1>&2エラーメッセージを stderr に送信することに注意してください。
  • Windows バッチ ファイルに空白行が必要ですか? ECHO:またはバリエーションのいずれかを使用する必要があります。
于 2018-06-02T02:41:43.377 に答える
3

新しいバッチ ファイル (例: openclass.bat) を作成し、ファイルに次の行を書き込みます。

java %~n1

次に、バッチファイルをたとえばsystem32フォルダーに配置し、Javaクラスファイルに移動し、右クリックして、[プロパティ]、[プログラムから開く...]、次にバッチファイルを見つけて選択します...

わたしにはできる。

PS: Java クラスを閉じるときに cmd ウィンドウを閉じる方法が見つかりません。今のところ...

于 2011-02-06T13:33:17.350 に答える
2

対になった引数

引数をキーと値のペアで渡したい場合は、次のようなものを使用できます。

@echo off

setlocal enableDelayedExpansion

:::::  asigning arguments as a key-value pairs:::::::::::::
set counter=0
for %%# in (%*) do (    
    set /a counter=counter+1
    set /a even=counter%%2
    
    if !even! == 0 (
        echo setting !prev! to %%#
        set "!prev!=%%~#"
    )
    set "prev=%%~#"
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: showing the assignments
echo %one% %two% %three% %four% %five%

endlocal

そして例:

c:>argumentsDemo.bat one 1 "two" 2 three 3 four 4 "five" 5
1 2 3 4 5

定義済み変数

事前にいくつかの環境変数を設定することもできます。コンソールで設定するか、コンピューターから設定することで実行できます。

@echo off

if defined variable1 (
    echo %variable1%
)

if defined variable2 (
    echo %variable2%
)

そしてそれを次のように呼び出します:

c:\>set variable1=1

c:\>set variable2=2

c:\>argumentsTest.bat
1
2

値がリストされたファイル

必要な値があらかじめ設定されているファイルを指定することもできます。これがスクリプトの場合:

@echo off

setlocal
::::::::::
set "VALUES_FILE=E:\scripts\values.txt"
:::::::::::


for /f "usebackq eol=: tokens=* delims=" %%# in ("%VALUES_FILE%") do set "%%#"

echo %key1% %key2% %some_other_key%

endlocal

値ファイルは次のとおりです。

:::: use EOL=: in the FOR loop to use it as a comment

key1=value1

key2=value2

:::: do not left spaces arround the =
:::: or at the begining of the line

some_other_key=something else

and_one_more=more

それを呼び出した出力は次のようになります。

値1 値2 他の何か

もちろん、すべてのアプローチを組み合わせることができます。引数の構文シフトも確認してください

于 2020-11-09T10:20:58.777 に答える