我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。
下面是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
当前回答
如果你想智能地处理缺失的参数,你可以这样做:
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
其他回答
让我们保持简单。
下面是.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>
如果你担心安全/密码盗窃(导致你设计这个解决方案,需要登录凭证在执行而不是静态的硬编码不需要数据库),然后您可以存储api或一半密码解密的代码或程序文件解密密钥,所以在运行时,用户将在控制台输入用户名/密码散列/解密之前传递给程序代码执行通过设置/ p,如果你查看在运行时用户输入凭据。
如果您正在运行一个脚本,使用不同的用户/密码运行程序,那么命令行参数将适合您。
如果您正在制作一个测试文件来查看不同登录的输出/效果,那么您可以将所有登录存储在一个加密文件中,作为参数传递给test。Cmd,除非你想坐在命令行并输入所有的登录,直到完成。
可以提供的参数数量限制为命令行上的字符总数。为了克服这一限制,上一段技巧是一种变通方法,不会有暴露用户密码的风险。
我是这样做的:
@fake-command /u %1 /p %2
下面是命令的样子:
test.cmd admin P@55w0rd > test-log.txt
%1应用于第一个参数,%2(这是棘手的部分)应用于第二个参数。您最多可以通过这种方式传递9个参数。
如果你想智能地处理缺失的参数,你可以这样做:
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并展开%1(也适用于%2 ..% *)。 因此,即使是“&”&也可以被重复而不会产生错误,正如上面所说的那样。
但是为了能够重定向echo on的输出,您需要两个for循环。
额外的字符* #用于安全对抗/?(有助于快速眼动)。 或者行尾的插入号可以作为多行字符,甚至在rem之后。
然后从文件中读取rem参数输出,但要小心。 FOR /F应该在延迟展开关闭的情况下工作,否则带有"!"的内容将被销毁。 在删除param1中的额外字符后,您就得到了它。
要以安全的方式使用param1,请启用延迟扩展。