我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
当前回答
访问批处理参数可以简单地使用%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,请启用延迟扩展。
其他回答
批处理文件
set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%
%1和%2分别返回第一个和第二个参数值。
在命令行中,传递参数
Directory> batchFileName admin P@55w0rd
输出将是
admin
P@55w0rd
对于使用循环获取所有参数并纯批处理:
注意事项:用于不带:?*&|<>
@echo off && setlocal EnableDelayedExpansion
for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && (
call set "_arg_[!_cnt!]=!_arg_!" && for /l %%l in (!_cnt! 1 !_cnt!
)do echo/ The argument n:%%l is: !_arg_[%%l]!
)
goto :eof
你的代码已经准备好在需要的地方用参数号做一些事情,比如……
@echo off && setlocal EnableDelayedExpansion
for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && call set "_arg_[!_cnt!]=!_arg_!"
fake-command /u !_arg_[1]! /p !_arg_[2]! > test-log.txt
要在命令行中引用一个set变量,你需要使用%a%,例如:
set a=100
echo %a%
rem output = 100
注意:这适用于Windows 7 pro。
简单的解决方法(即使问题已经很老了)
Test1.bat
echo off
echo "Batch started"
set arg1=%1
echo "arg1 is %arg1%"
echo on
pause
CallTest1.bat
call "C:\Temp\Test1.bat" pass123
输出
YourLocalPath>call "C:\Temp\test.bat" pass123
YourLocalPath>echo off
"Batch started"
"arg1 is pass123"
YourLocalPath>pause
Press any key to continue . . .
其中YourLocalPath是当前目录路径。
为了简单起见,将命令参数存储在变量中,并使用变量进行比较。
它不仅写起来简单,而且维护起来也很简单,所以如果后来其他人或你在很长一段时间后阅读了你的脚本,它将很容易理解和维护。
内联编写代码:参见其他答案。
另一个有用的技巧是使用%*表示“所有”。例如:
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
我的语法可能有点错误,但这是大意。