如何将命令行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
时使用if
和for
和团伙。
如果您忘记了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窗口的方法。 目前…