有没有办法将超过9个变量作为参数传递给另一个批处理文件?

时间:2018-01-06 04:02:56

标签: batch-file batch-processing

我试图将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个之后变得混乱,它只是开始在变量的末尾添加数字。我正在为自己做这个,看看我是否可以将它实现为随机函数来选择名称。

2 个答案:

答案 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 callcall /?help for以及for /?help shift进行此尝试。

文件夹shift /?中的ping.exexcopy.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_2var[1],...会使参数和变量处理变得更加容易,因为整数可以很容易地增加,而从列表中获取下一个字母更难以实现。

另见Copy text from a Windows CMD window to clipboard