我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
当前回答
是的,在使用if和for和the gang时,不要忘记使用%%1这样的变量。
如果您忘记使用double %,那么您将替换(可能为空)命令行参数,并且您将收到一些非常令人困惑的错误消息。
其他回答
另一个有用的技巧是使用%*表示“所有”。例如:
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
我的语法可能有点错误,但这是大意。
是的,在使用if和for和the gang时,不要忘记使用%%1这样的变量。
如果您忘记使用double %,那么您将替换(可能为空)命令行参数,并且您将收到一些非常令人困惑的错误消息。
FOR %%A IN (%*) DO (
REM Now your batch file handles %%A instead of %1
REM No need to use SHIFT anymore.
ECHO %%A
)
这个循环遍历批处理参数(%*),不管它们是否带引号,然后回显每个参数。
成对的参数
如果你喜欢在键值对中传递参数,你可以使用这样的方法:
@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
values文件是这样的:
:::: 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
调用它的输出将是:
Value1 value2别的东西
当然,您可以结合所有方法。检查参数语法,shift
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue
注意:如果“%1”==“”将导致问题,如果%1本身被括在引号中。
在这种情况下,使用IF[%1]==[],或者仅在NT 4 (SP6)及以后版本中使用IF "%~1"==""。