我需要在运行批处理文件时传递ID和密码,而不是将它们硬编码到文件中。
以下是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
我需要在运行批处理文件时传递ID和密码,而不是将它们硬编码到文件中。
以下是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
另一个有用的提示是使用%*
表示“全部”。例如:
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
我可能语法稍有错误,但这是一般思路。
fake-command /u admin /p password admin password foo bar
。这已经在多年前被 @Joey 指出。 - jwdonahue这是我做到它的方式:
@fake-command /u %1 /p %2
以下是该命令的样例:
test.cmd admin P@55w0rd > test-log.txt
%1
应用于第一个参数,%2
(这是棘手的部分) 应用于第二个参数。您可以通过这种方式传递最多9个参数。
echo %1 %2
,然而由于有个带有 @
和参数的 fake-command
的存在,这个最简单的情况不可复制,你会被扰乱了,认为我们之后会得到 fake-command.bat
的内容(在这种情况下,过于复杂的 fake-command.bat
可能会使用 echo %2 %4
来忽略参数名称)。 错了,笨蛋。 TL;DR: 不要像我一样蠢。 1. echo echo %1 %2 > test.bat
2. test word1 word2
。3. 获利。 - ruffinecho echo %1 %2 > test.bat
。test.bat文件中将会有echo %1 %2
(你也可以从文本编辑器中保存它)。现在输入test word1 word2
以调用并查看参数是否起作用。word1 word2
将被回显到命令行。(echo %2 %4
将忽略/u
和/p
,所以你可以调用test /u word1 /p word2
来获得相同的结果)。@
在bat文件中表示该命令不会被重复执行。 - ruffin如果您想智能处理缺失参数,可以尝试以下方法:
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!'
关键在于启用echo on
,并在rem
语句之后扩展%1(也适用于%2 .. %*
)。这样即使是类似"&"&
的字符也可以被回显而不会产生错误,因为已经进行了注释。echo on
的输出,需要使用两个for循环。* #
用于防止内容出现如 /?
(将显示REM
的帮助信息)之类的情况。或者,在行末添加一个插入符号^可以作为多行字符,甚至在rem
之后也是如此。rem参数
的输出,但要小心处理。FOR /F应该使用延迟扩展关闭,否则包含“!”的内容将被破坏。在删除param1
中的额外字符之后,您就得到它了。param1
,请启用延迟扩展。&
,你的解决方案仅适用于简单内容。 - jebtest.bat ^&
失败了。只有 test.bat "&"
可以正常工作,但这不是我的重点。如果没有 REM 技巧,你无法安全地使用 %*
、%1
。 - jeb>template.bat [-f] [--flag] [--namedvalue value] arg1 [arg2][arg3][...]
:init
、:parse
和:main
函数。
@::!/dos/rocks
@echo off
goto :init
:header
echo %__NAME% v%__VERSION%
echo This is a sample batch file template,
echo providing command-line arguments and flags.
echo.
goto :eof
:usage
echo USAGE:
echo %__BAT_NAME% [flags] "required argument" "optional argument"
echo.
echo. /?, --help shows this help
echo. /v, --version shows the version
echo. /e, --verbose shows detailed output
echo. -f, --flag value specifies a named parameter value
goto :eof
:version
if "%~1"=="full" call :header & goto :eof
echo %__VERSION%
goto :eof
:missing_argument
call :header
call :usage
echo.
echo **** MISSING "REQUIRED ARGUMENT" ****
echo.
goto :eof
:init
set "__NAME=%~n0"
set "__VERSION=1.24"
set "__YEAR=2023"
set "__BAT_FILE=%~0"
set "__BAT_PATH=%~dp0"
set "__BAT_NAME=%~nx0"
set "OptHelp="
set "OptVersion="
set "OptVerbose="
set "UnNamedArgument="
set "UnNamedOptionalArg="
set "NamedFlag="
:parse
if "%~1"=="" goto :validate
if /i "%~1"=="/?" call :header & call :usage "%~2" & goto :end
if /i "%~1"=="-?" call :header & call :usage "%~2" & goto :end
if /i "%~1"=="--help" call :header & call :usage "%~2" & goto :end
if /i "%~1"=="/v" call :version & goto :end
if /i "%~1"=="-v" call :version & goto :end
if /i "%~1"=="--version" call :version full & goto :end
if /i "%~1"=="/e" set "OptVerbose=yes" & shift & goto :parse
if /i "%~1"=="-e" set "OptVerbose=yes" & shift & goto :parse
if /i "%~1"=="--verbose" set "OptVerbose=yes" & shift & goto :parse
if /i "%~1"=="--flag" set "NamedFlag=%~2" & shift & shift & goto :parse
if /i "%~1"=="-f" set "NamedFlag=%~2" & shift & shift & goto :parse
if not defined UnNamedArgument set "UnNamedArgument=%~1" & shift & goto :parse
if not defined UnNamedOptionalArg set "UnNamedOptionalArg=%~1" & shift & goto :parse
shift
goto :parse
:validate
if not defined UnNamedArgument call :missing_argument & goto :end
:main
if defined OptVerbose (
echo **** DEBUG IS ON
)
echo UnNamedArgument: "%UnNamedArgument%"
if defined UnNamedOptionalArg echo UnNamedOptionalArg: "%UnNamedOptionalArg%"
if not defined UnNamedOptionalArg echo UnNamedOptionalArg: not provided
if defined NamedFlag echo NamedFlag: "%NamedFlag%"
if not defined NamedFlag echo NamedFlag: not provided
:end
call :cleanup
exit /B
:cleanup
REM The cleanup function is only really necessary if you
REM are _not_ using SETLOCAL.
set "__NAME="
set "__VERSION="
set "__YEAR="
set "__BAT_FILE="
set "__BAT_PATH="
set "__BAT_NAME="
set "OptHelp="
set "OptVersion="
set "OptVerbose="
set "UnNamedArgument="
set "UnNamedArgument2="
set "NamedFlag="
goto :eof
用例 | 返回结果 |
---|---|
template.bat |
模板 v1.24 这是一个示例的批处理文件模板, 提供命令行参数和标志。 用法: template.bat [flags] "required argument" "optional argument" /?, --help 显示此帮助 /v, --version 显示版本号 /e, --verbose 显示详细输出 -f, --flag value 指定命名参数值 **** 缺少 "REQUIRED ARGUMENT" **** |
template.bat /? |
模板 v1.24 这是一个示例的批处理文件模板, 提供命令行参数和标志。 用法: template.bat [flags] "required argument" "optional argument" /?, --help 显示此帮助 /v, --version 显示版本号 /e, --verbose 显示详细输出 -f, --flag value 指定命名参数值 |
template.bat --v | 1.24 |
template.bat --version |
模板 v1.24 这是一个示例的批处理文件模板, 提供命令行参数和标志。 |
template.bat -e arg1 |
**** 调试已开启 未命名参数:"arg1" 未命名可选参数:未提供 命名标志:未提供 |
template.bat --flag "my flag" arg1 arg2 (without -e) |
未命名参数: "arg1" 未命名可选参数:"arg2" 命名标志:"my flag" |
template.bat --verbose "argument #1" --flag "my flag" second |
**** 调试已开启 未命名参数:"argument #1" 未命名可选参数:"second" 命名标志:"my flag" |
-f
标志实际上还没有包含在解析部分中。提前告诉你! - Flo@::!/dos/rocks
是做什么用的? - MrJman006是的,在使用if
、for
等命令时,不要忘记使用变量,例如%%1
。
如果忘记了双重百分号%
,则可能会替换掉(可能为空的)命令行参数,并收到一些非常混乱的错误消息。
if
和 for
语句吗? - Royi Namirfor %%d in (*) do echo %%d
从命令行中: for %d in (*) do echo %d
。 - Steve Midgleytest 1
) 调用 @for %%2 in (testing) do @echo %%2 %1
时,会生成 testing 1
。 - jwdonahue%%1
不能访问命令行参数,对于IF
命令也是错误的。只有在批处理文件中使用FOR
命令需要双百分号,但即使如此,%%1
也只能定义一个FOR参数,而不能访问参数。 - jeb不需要把它复杂化。它只是命令 %1 %2 参数,例如:
@echo off
xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z
echo copied %1 to %2
pause
“暂停”命令会显示批处理文件执行的内容,并等待您按下任意键。将其保存为xx.bat文件并放在Windows文件夹中。
要使用它,例如输入:
xx c:\f\30\*.* f:\sites\30
这个批处理文件会处理所有必要的参数,例如仅复制那些更新的文件等等。我从 Windows 以前就一直在使用它。如果你希望看到正在进行复制的文件名,请省略 Q
参数。
所有人都回答了非常复杂的问题,但实际上这很简单。 %1 %2 %3
等等是传递给文件的参数。 %1
是第一个参数,%2
是第二个参数,依此类推。
所以,如果我有一个包含以下内容的批处理脚本:
@echo off
echo %1
当我运行批处理脚本时,我输入了这个:
C:> script.bat Hello
脚本将简单地输出这个:
Hello
这对于脚本中某些变量(例如名称和年龄)非常有用。因此,如果我有一个像这样的脚本:
@echo off
echo Your name is: %1
echo Your age is: %2
当我输入这个时:
C:> script.bat Oliver 1000
我得到了这个的输出:
Your name is: Oliver
Your age is: 1000
在批处理文件中
set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%
%1
和%2
分别返回第一个和第二个参数的值。
在命令行中,传递参数。
Directory> batchFileName admin P@55w0rd
输出结果将会是
admin
P@55w0rd
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue
注意: 如果%1
本身被引号包含,"%1"==""
会导致问题。
在这种情况下,请使用IF [%1]==[]
或者仅适用于NT 4(SP6)及其后续版本的IF "%~1"==""
。