我试图将14个变量从一个文件传递到另一个文件,但是在第9个变量之后它会停止工作。
这是我使用的代码和输出。
caller.bat
的代码:
@echo off
set vara=A
set varb=B
set varc=C
set vard=D
set vare=E
set varf=F
set varg=G
set varh=H
set vari=I
set varj=J
set vark=K
set varl=L
set varm=M
set varn=N
echo Variables set in caller.bat:
echo %vara%
echo %varb%
echo %varc%
echo %vard%
echo %vare%
echo %varf%
echo %varg%
echo %varh%
echo %vari%
echo %varj%
echo %vark%
echo %varl%
echo %varm%
echo %varn%
echo Calling passTo.bat
call passTo.bat %vara% %varb% %varc% %vard% %vare% %varf% %varg% %varh% %vari% %varj% %vark% %varl% %varm% %varn%
pause>nul
caller.bat
的输出:
Variables set in caller.bat:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Calling passTo.bat
passTo.bat
的代码:
echo Inside passTo.bat
set vara=%1
set varb=%2
set varc=%3
set vard=%4
set vare=%5
set varf=%6
set varg=%7
set varh=%8
set vari=%9
set varj=%10
set vark=%11
set varl=%12
set varm=%13
set varn=%14
echo vara: %vara%
echo varb: %varb%
echo varc: %varc%
echo vard: %vard%
echo vare: %vare%
echo varf: %varf%
echo varg: %varg%
echo varh: %varh%
echo vari: %vari%
echo varj: %varj%
echo vark: %vark%
echo varl: %varl%
echo varm: %varm%
echo varn: %varn%
passTo.bat
的输出:
Inside passTo.bat
vara: A
varb: B
varc: C
vard: D
vare: E
varf: F
varg: G
varh: H
vari: I
varj: A0
vark: A1
varl: A2
varm: A3
varn: A4
可以看出它在第9个之后变得混乱,它只是开始在变量的末尾添加数字。我正在为自己做这个,看看我是否可以将它实现为随机函数来选择名称。
答案 0 :(得分:1)
来自shift /?
:
C:\Users\iBug>shift /?
Changes the position of replaceable parameters in a batch file.
SHIFT [/n]
If Command Extensions are enabled the SHIFT command supports
the /n switch which tells the command to start shifting at the
nth argument, where n may be between zero and eight. For example:
SHIFT /2
would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected.
因此,如果您有12个参数,则可以使用3个shift
。之后,原始的第1和第2个参数将不再可用(以及%0
),原始的第10到第12个参数将以%7
,%8
和{{1}的形式提供}}
示例代码:
%9
像这样运行:
REM Filename: foo.bat
@ECHO OFF
ECHO %1 %2 %3 %4
SHIFT
SHIFT
SHIFT
ECHO %1 %2 %3 %4
ECHO %6 %7 %8 %9
您还可以使用开关保留前8个参数,并且每次只丢弃第9个参数:
C:\Users\iBug>foo.bat a b c d e f g h i j k l
a b c d
d e f g
i j k l
C:\Users\iBug>
答案 1 :(得分:0)
可以通过打开命令提示符窗口并运行cmd.exe
命令或命令 {来获取和阅读help
的内部命令的帮助{1}}。使用/?
或help call
和call /?
或help for
以及for /?
或help shift
进行此尝试。
文件夹shift /?
中的ping.exe
或xcopy.exe
等标准控制台应用程序也支持使用选项%SystemRoot%\System32
执行以显示帮助。使用/?
,ping /?
或choice /?
进行试用。这些可执行文件也称为外部命令,默认情况下在Windows上可用(取决于Windows版本),但不是find /?
的内部命令。
以下是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
。
使用命令 SHIFT 时,通过参数将字符串传递给另一个批处理文件,可以产生最佳结果。但真正最好的解决方案是使用环境变量将字符串从一个批处理文件传递到另一个批处理文件,如上一个变量列表所示,与passTo.bat
的输出相同,因为caller.bat
输出父批处理文件定义的环境变量
所有这三种方法都能很好地解析简单的字符串,例如用双引号括起来的文件名字符串,而不是通过参数列表包含passTo.bat
或%
或!
。
使用变量命名方案,如^
,var_1
,...或var_2
,var[1]
,...会使参数和变量处理变得更加容易,因为整数可以很容易地增加,而从列表中获取下一个字母更难以实现。