ID とパスワードをファイルにハードコーディングするのではなく、実行時にバッチ ファイルに渡す必要があります。
コマンドラインは次のようになります。
test.cmd admin P@55w0rd > test-log.txt
ID とパスワードをファイルにハードコーディングするのではなく、実行時にバッチ ファイルに渡す必要があります。
コマンドラインは次のようになります。
test.cmd admin P@55w0rd > test-log.txt
もう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
構文が少し間違っているかもしれませんが、これが一般的な考え方です。
これが私がそれをした方法です:
@fake-command /u %1 /p %2
コマンドは次のようになります。
test.cmd admin P@55w0rd > test-log.txt
これ%1
は最初のパラメーターに適用されます%2
(そしてここで注意が必要な部分) が 2 番目のパラメーターに適用されます。この方法で最大 9 個のパラメーターを渡すことができます。
不足しているパラメーターをインテリジェントに処理したい場合は、次のようにすることができます。
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
バッチパラメータへのアクセスは、%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
には、遅延拡張を有効にします。
ええ、そしてギャングを使用する%%1
ときのように、変数を使用することを忘れないでください。if
for
double を忘れると、%
コマンド ライン引数 (おそらく null) を代入することになり、かなり紛らわしいエラー メッセージが表示されます。
複雑にする必要はありません。コマンド %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
パラメーターを省略してください。
バッチファイルで
set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%
%1
%2
それぞれ、1 番目と 2 番目の引数の値を返します。
そしてコマンドラインで、引数を渡します
Directory> batchFileName admin P@55w0rd
出力は
admin
P@55w0rd
これを簡単にしましょう。
これが .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>
FOR %%A IN (%*) DO (
REM Now your batch file handles %%A instead of %1
REM No need to use SHIFT anymore.
ECHO %%A
)
これは、引用符で囲まれているかどうかに関係なく、バッチ パラメーター (%*) をループしてから、各パラメーターをエコーします。
.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
が、値を持たないパラメーターのリストを事前に知らずに空の値を許可する方法は考えられません。変更ログ
-
以前のパラメータを探すことで、他のコマンド ライン引数で動作するようになりました。皆さんとても複雑な回答をされていますが、実はとてもシンプルです。%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
@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
引用符を削除するために使用します。IF "%ARG%" == ""
and not IF [%ARG%] == []
because[
と]
don't play は、スペースで終わる値を使用します。SHIFT
内であっても、などの現在の引数は、が解析されるときに決定されるため、更新されません。ブロック内でandを使用できますが、 . わかりやすくするために をブロックの最後に置くこともできますが、それは失われたり、人々を混乱させたりする可能性があります。したがって、「キャプチャ」してブロックの外に出すのが最善のようです。IF
%~1
IF
%~1
%~2
IF
SHIFT
SHIFT
%~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 に送信することに注意してください。ECHO:
またはバリエーションのいずれかを使用する必要があります。新しいバッチ ファイル (例: openclass.bat) を作成し、ファイルに次の行を書き込みます。
java %~n1
次に、バッチファイルをたとえばsystem32フォルダーに配置し、Javaクラスファイルに移動し、右クリックして、[プロパティ]、[プログラムから開く...]、次にバッチファイルを見つけて選択します...
わたしにはできる。
PS: Java クラスを閉じるときに cmd ウィンドウを閉じる方法が見つかりません。今のところ...
引数をキーと値のペアで渡したい場合は、次のようなものを使用できます。
@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 他の何か