我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
当前回答
成对的参数
如果你喜欢在键值对中传递参数,你可以使用这样的方法:
@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
其他回答
访问批处理参数可以简单地使用%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变量,你需要使用%a%,例如:
set a=100
echo %a%
rem output = 100
注意:这适用于Windows 7 pro。
我是这样做的:
@fake-command /u %1 /p %2
下面是命令的样子:
test.cmd admin P@55w0rd > test-log.txt
%1应用于第一个参数,%2(这是棘手的部分)应用于第二个参数。您最多可以通过这种方式传递9个参数。
创建一个新的批处理文件(例如:openclass.bat),并在文件中写入这一行:
java %~n1
然后将批处理文件放在system32文件夹中,找到你的Java类文件,右键单击,Properties, Open with…,然后找到你的批处理文件,选择它,这就是…
这对我很管用。
PS:当我关闭Java类时,我找不到关闭cmd窗口的方法。现在……
成对的参数
如果你喜欢在键值对中传递参数,你可以使用这样的方法:
@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