可以通过打开命令提示符窗口并运行help command 或command /? 来获取和阅读cmd.exe 的内部命令的帮助。用help call 或call /? 和help for 或for /? 和help shift 或shift /? 试试这个。
ping.exe 文件夹中的ping.exe 或xcopy.exe 等标准控制台应用程序支持也使用选项/? 执行以显示帮助。试试ping /?、choice /? 或find /?。这些可执行文件也称为 Windows 默认可用的外部命令(取决于 Windows 版本),但不是 cmd.exe 的内部命令。
这是caller.bat 的代码,其中包含一些非常难看的字符串:
@echo off
setlocal
set "vara="""
set "varb=B"
set "varc="C""
set "vard=Hello!"
set "vare="%%PATH%%""
set "varf=F"
set "varg=G"
set "varh=Operators: &()[]{}^=;!'+,`~<>|"
set "vari=I"
set "varj=J"
set "vark=K"
set "varl=!PATHEXT!"
set "varm=M"
set "varn=N"
cls
echo Variables set in %~nx0:
echo/
set var
echo/
echo Calling passTo.bat
echo/
setlocal EnableDelayedExpansion
call passTo.bat %vara% %varb% %varc% !vard! !vare! %varf% %varg% "!varh!" %vari% %varj% %vark% "!varl!" %varm% %varn%
endlocal
endlocal
这个批处理文件的输出是:
Variables set in caller.bat:
vara=""
varb=B
varc="C"
vard=Hello!
vare="%PATH%"
varf=F
varg=G
varh=Operators: &()[]{}^=;!'+,`~<>|
vari=I
varj=J
vark=K
varl=!PATHEXT!
varm=M
varn=N
Calling passTo.bat
这里是passTo.bat 的代码,其中包含三种处理传递参数的方法。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Is this batch file called with at least 1 argument string?
if not "%~1" == "" goto MainCode
rem It can be even an empty argument string, i.e. just "".
if #%1 == #"" goto Maincode
echo %~nx0 is called with no argument.
goto EndBatch
rem ArgumentToVariable is a subroutine called from FOR loop below.
:ArgumentToVariable
call set "Letter=%%Indices:~%Index%,1%%
set var%Letter%=%1
set /A Index+=1
goto :EOF
:MainCode
echo Inside %~nx0 executed with the arguments:
echo %*
set "Index=0"
set "Indices=abcdefghijklmn"
for %%I in (%*) do call :ArgumentToVariable %%I
echo/
echo Arguments list processed with command FOR with using a subroutine:
echo/
set var
rem End current local environment to discard all environment variables.
endlocal
rem Setup a new local environment to recreate all variables once again.
setlocal EnableExtensions EnableDelayedExpansion
set "Index=0"
set "Indices=abcdefghijklmn"
for %%I in (%*) do (
set "Letter=Indices:~!Index!,1"
call set "Letter=%%!Letter!%%"
set var!Letter!=%%I
set /A Index+=1
)
echo/
echo Arguments list processed with command FOR with using delayed expansion:
echo/
set var
rem End current local environment to discard all environment variables.
endlocal
rem Setup a new local environment to recreate all variables once again.
setlocal EnableExtensions DisableDelayedExpansion
set "Index=0"
set "Indices=abcdefghijklmn"
:ShiftLoop
call set "Letter=%%Indices:~%Index%,1%%
set var%Letter%=%1
set /A Index+=1
shift
if not "%~1" == "" goto ShiftLoop
if #%1 == #"" goto ShiftLoop
echo/
echo Arguments list processed with command SHIFT:
echo/
set var
:EndBatch
endlocal
echo/
echo Variables list as defined by parent batch file:
echo/
set var
passTo.bat 的输出是:
Inside passTo.bat executed with the arguments:
"" B "C" Hello! "C:\Windows\System32;C:\Windows;C:\Windows\system32\wbem" F G "
Operators: &()[]{}^^=;!'+,`~<>|" I J K "!PATHEXT!" M N
Arguments list processed with command FOR with using a subroutine:
vara=""
varb=B
varc="C"
vard=Hello!
vare="C:\Windows\System32;C:\Windows;C:\Windows\system32\wbem"
varf=F
varg=G
varh="Operators: &()[]{}^^^^=;!'+,`~<>|"
vari=I
varj=J
vark=K
varl="!PATHEXT!"
varm=M
varn=N
Arguments list processed with command FOR with using delayed expansion:
vara=""
varb=B
varc="C"
vard=Hello\Windows\System32
vare=C:\Windows
varf=C:\Windows\system32\wbem" F G "Operators:
varg=&()[]{}
varh=PATHEXT" M N
vari=I
varj=J
vark=K
varl=!PATHEXT!
varm=M
varn=N
Arguments list processed with command SHIFT:
vara=""
varb=B
varc="C"
vard=Hello!
vare="C:\Windows\System32;C:\Windows;C:\Windows\system32\wbem"
varf=F
varg=G
varh="Operators: &()[]{}^^=;!'+,`~<>|"
vari=I
varj=J
vark=K
varl="!PATHEXT!"
varm=M
varn=N
Variables list as defined by parent batch file:
vara=""
varb=B
varc="C"
vard=Hello!
vare="%PATH%"
varf=F
varg=G
varh=Operators: &()[]{}^=;!'+,`~<>|
vari=I
varj=J
vark=K
varl=!PATHEXT!
varm=M
varn=N
通过比较列表可以看出,一些参数字符串不是通过参数列表从批处理文件caller.bat 未经修改地传递到passTo.bat。
最好的结果是通过使用命令SHIFT 将字符串通过参数传递给另一个批处理文件的方法产生的。但真正最好的解决方案是使用环境变量将字符串从一个批处理文件传递到另一个批处理文件,如最后一个变量列表所示与caller.bat 的输出相同,因为passTo.bat 输出由父批处理文件定义的环境变量。
这三种方法都可以很好地解析简单的字符串,例如用双引号括起来的文件名字符串,并且通过参数列表不包含 % 或 ! 或 ^。
并且使用像var_1、var_2、...或var[1]、var[2]等变量命名方案将使参数和变量处理绝对更容易,因为整数可以在获取时轻松递增列表中的下一个字母更难实现。
另见Copy text from a Windows CMD window to clipboard。