我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
当前回答
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue
注意:如果“%1”==“”将导致问题,如果%1本身被括在引号中。
在这种情况下,使用IF[%1]==[],或者仅在NT 4 (SP6)及以后版本中使用IF "%~1"==""。
其他回答
如果你想智能地处理缺失的参数,你可以这样做:
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
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue
注意:如果“%1”==“”将导致问题,如果%1本身被括在引号中。
在这种情况下,使用IF[%1]==[],或者仅在NT 4 (SP6)及以后版本中使用IF "%~1"==""。
访问批处理参数可以简单地使用%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并展开%1(也适用于%2 ..% *)。 因此,即使是“&”&也可以被重复而不会产生错误,正如上面所说的那样。
但是为了能够重定向echo on的输出,您需要两个for循环。
额外的字符* #用于安全对抗/?(有助于快速眼动)。 或者行尾的插入号可以作为多行字符,甚至在rem之后。
然后从文件中读取rem参数输出,但要小心。 FOR /F应该在延迟展开关闭的情况下工作,否则带有"!"的内容将被销毁。 在删除param1中的额外字符后,您就得到了它。
要以安全的方式使用param1,请启用延迟扩展。
我写了一个简单的read_params脚本,可以作为函数(或外部.bat)调用,并将所有变量放入当前环境中。它不会修改原始形参,因为函数是用原始形参的副本调用的。
例如,给定以下命令:
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,但我想不出一种方法来允许空值,而不知道提前知道一个参数列表,不会有一个值。
更新日志
2/18/2016 不再需要延迟扩展 现在通过查找- before形参来处理其他命令行参数。
另一个有用的技巧是使用%*表示“所有”。例如:
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
我的语法可能有点错误,但这是大意。