如何将命令行parameter passing给batch file?

我需要在运行时将ID和密码传递给cmd(或bat)文件,而不是将其硬编码到文件中。

以下是命令行的样子:

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

另一个有用的提示是使用%*来表示“全部”。 例如,

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

当你运行:

 test-command admin password foo bar 

上面的batch file将运行:

 fake-command /u admin /p password foo bar 

我可能会有语法错误,但这是一般的想法。

这是我怎么做的。

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

以下是命令行的样子:

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

%1适用于第一个参数%2(这里是棘手的部分)适用于第二个参数。 用这种方法最多可以传递9个参数。

如果你想聪明地处理缺less的参数,你可以做一些事情:

 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="&"&" 

而每条线都会失败,因为其中一个&是在引号之外。

它可以通过从临时文件读取参数的标记版本来解决。

 @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!' 

诀窍是在rem语句之后启用echo on并展开%1(与%2 ..%*一起使用)。
所以即使是"&"&也可以被回应而不会产生错误,正如它所说的那样。

但为了能够redirect回显的输出,您需要两个FOR-LOOPS。

额外的字符* #被用来保护像/这样的内容。 (会显示REM的帮助)。
或者在行尾的插入符号可以作为多行字符,甚至在rem

然后仔细阅读从文件中输出的rem参数
FOR / F应该使用延迟扩展,否则内容为“!” 将被销毁。
删除了param1中的多余字符后,就可以了。

并且以安全的方式使用param1,启用延迟扩展。

是的,只是不要忘记使用variables如%%1时使用iffor和团伙。

如果您忘记了double % ,那么您将replace(可能为null)命令行参数,您将收到一些相当混乱的错误消息。

没有必要使它复杂化。 这只是命令%1%2的参数,例如,

 @echo off xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z echo copied %1 to %2 pause 

“暂停”显示batch file已经完成的内容,并等待您点击ANY键。 将其另存为Windows文件夹中的xx.bat。

要使用它,input,例如:

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

这个batch file负责处理所有必要的参数,比如只复制文件,更新等。我之前使用过它,因为在Windows之前。 如果您希望在复制文件时看到文件的名称,请不要使用Q参数。

 @ECHO OFF :Loop IF "%1"=="" GOTO Continue SHIFT GOTO Loop :Continue 

注意:如果%1被括在引号本身中,如果"%1"==""将导致问题。

在这种情况下,请使用IF [%1]==[]或者在NT 4(SP6)及更高版本中使用IF "%~1"==""

让我们保持简单。

这是.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> 

我写了一个简单的read_params脚本,可以作为一个函数(或外部的.bat )调用,并将所有variables放入当前环境。 它不会修改原始参数,因为函数正在call原始参数的副本。

例如,给出以下命令:

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

在调用函数之后, myscript.bat将能够使用variables:

 call :read_params %* echo %random% echo %greeting% 

这个function:

 :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日
    • 不再需要延期扩张
    • 现在通过在参数之前查找来处理其他命令行参数。
 FOR %%A IN (%*) DO ( REM Now your batch file handles %%A instead of %1 REM No need to use SHIFT anymore. ECHO %%A ) 

这个循环遍历批处理参数(%*),不pipe它们是否被引用,然后回显每个参数。

最近有个朋友问我这个问题,所以我想我会发布如何处理batch file中的命令行参数。

这个技术有一些额外的开销,但是这使得我的batch file很容易理解并且很快实现。 以及支持以下结构:

 >template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...] 

它的主要特点是:init:parse:main函数。

用法示例

 >template.bat /? test v1.23 This is a sample batch file template, providing command-line arguments and flags. USAGE: test.bat [flags] "required argument" "optional argument" /?, --help shows this help /v, --version shows the version /e, --verbose shows detailed output -f, --flag value specifies a named parameter value >template.bat <- throws missing argument error (same as /?, plus..) **** **** **** MISSING "REQUIRED ARGUMENT" **** **** **** >template.bat -v 1.23 >template.bat --version test v1.23 This is a sample batch file template, providing command-line arguments and flags. >template.bat -e arg1 **** DEBUG IS ON UnNamedArgument: "arg1" UnNamedOptionalArg: not provided NamedFlag: not provided >template.bat --flag "my flag" arg1 arg2 UnNamedArgument: "arg1" UnNamedOptionalArg: "arg2" NamedFlag: "my flag" >template.bat --verbose "argument #1" --flag "my flag" second **** DEBUG IS ON UnNamedArgument: "argument #1" UnNamedOptionalArg: "second" NamedFlag: "my flag" 

template.bat

 @::!/dos/rocks @echo off goto :init :header echo %__NAME% v%__VERSION% echo This is a sample batch file template, echo providing command-line arguments and flags. echo. goto :eof :usage echo USAGE: echo %__BAT_NAME% [flags] "required argument" "optional argument" echo. echo. /?, --help shows this help echo. /v, --version shows the version echo. /e, --verbose shows detailed output echo. -f, --flag value specifies a named parameter value goto :eof :version if "%~1"=="full" call :header & goto :eof echo %__VERSION% goto :eof :missing_argument call :header call :usage echo. echo **** **** echo **** MISSING "REQUIRED ARGUMENT" **** echo **** **** echo. goto :eof :init set "__NAME=%~n0" set "__VERSION=1.23" set "__YEAR=2017" set "__BAT_FILE=%~0" set "__BAT_PATH=%~dp0" set "__BAT_NAME=%~nx0" set "OptHelp=" set "OptVersion=" set "OptVerbose=" set "UnNamedArgument=" set "UnNamedOptionalArg=" set "NamedFlag=" :parse if "%~1"=="" goto :validate if /i "%~1"=="/?" call :header & call :usage "%~2" & goto :end if /i "%~1"=="-?" call :header & call :usage "%~2" & goto :end if /i "%~1"=="--help" call :header & call :usage "%~2" & goto :end if /i "%~1"=="/v" call :version & goto :end if /i "%~1"=="-v" call :version & goto :end if /i "%~1"=="--version" call :version full & goto :end if /i "%~1"=="/e" set "OptVerbose=yes" & shift & goto :parse if /i "%~1"=="-e" set "OptVerbose=yes" & shift & goto :parse if /i "%~1"=="--verbose" set "OptVerbose=yes" & shift & goto :parse if /i "%~1"=="--flag" set "NamedFlag=%~2" & shift & shift & goto :parse if not defined UnNamedArgument set "UnNamedArgument=%~1" & shift & goto :parse if not defined UnNamedOptionalArg set "UnNamedOptionalArg=%~1" & shift & goto :parse shift goto :parse :validate if not defined UnNamedArgument call :missing_argument & goto :end :main if defined OptVerbose ( echo **** DEBUG IS ON ) echo UnNamedArgument: "%UnNamedArgument%" if defined UnNamedOptionalArg echo UnNamedOptionalArg: "%UnNamedOptionalArg%" if not defined UnNamedOptionalArg echo UnNamedOptionalArg: not provided if defined NamedFlag echo NamedFlag: "%NamedFlag%" if not defined NamedFlag echo NamedFlag: not provided :end call :cleanup exit /B :cleanup REM The cleanup function is only really necessary if you REM are _not_ using SETLOCAL. set "__NAME=" set "__VERSION=" set "__YEAR=" set "__BAT_FILE=" set "__BAT_PATH=" set "__BAT_NAME=" set "OptHelp=" set "OptVersion=" set "OptVerbose=" set "UnNamedArgument=" set "UnNamedArgument2=" set "NamedFlag=" goto :eof 

要在命令行中引用设置variables,您需要使用“%a%”,例如:

  set a=100 echo %a% output = 100 

注意:这适用于Windows 7专业版。

创build一个新的batch file(例如:openclass.bat)并在文件中写入以下行:

 java %~n1 

然后把batch file,比方说,system32文件夹,转到你的Java类文件,右键单击,属性,打开…,然后find你的batch file,select它,这就是…

它适用于我。

PS:当我closuresJava类时,我无法findclosurescmd窗口的方法。 目前…