Batch file 是否有方法将9个以上的变量作为参数传递给另一个批处理文件?

Batch file 是否有方法将9个以上的变量作为参数传递给另一个批处理文件?,batch-file,batch-processing,Batch File,Batch Processing,我试图将14个变量从一个文件批量传递到另一个文件,但在第9个变量之后它就停止工作了 下面是我使用的代码和输出 调用方.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

我试图将14个变量从一个文件批量传递到另一个文件,但在第9个变量之后它就停止工作了

下面是我使用的代码和输出

调用方.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
Variables set in caller.bat:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Calling 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%
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
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
Variables set in caller.bat:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Calling 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%
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
passTo.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
Variables set in caller.bat:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Calling 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%
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
passTo.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
Variables set in caller.bat:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Calling 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%
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个一次之后,它就搞砸了,它只是开始在变量的末尾添加数字。我这样做是为了看看是否可以将其实现到随机发生器以选择名称。

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。在此之后,原始的第一个和第二个参数将不再可用(以及
%0
),原始的第十个到第十二个参数将作为
%7
%8
%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
按如下方式运行:

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>
还可以使用开关保留前8个参数,每次仅放弃第9个参数:

SHIFT /8

打开命令提示符窗口并运行
Help
commandcommand
/?
可以获取和读取有关
cmd.exe内部命令的帮助。请使用
帮助呼叫
呼叫/?
帮助
帮助/?
帮助移位
移位/?

文件夹
%SystemRoot%\System32
中的
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
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
使用参数执行passTo.bat内部的
:
你好!C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem“F G”
运算符:&()[]{}^=;!'+,`~|“I J K”!PATHEXT!M N
使用子例程的命令处理的参数列表:
瓦拉=“”
varb=B
varc=“C”
你好!
vare=“C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem”
varf=F
varg=G
varh=“Operators:&()[]{}^^^=;!”+,`~|”
变量=I
varj=J
vark=K
varl=“!PATHEXT!”
varm=M
varn=N
使用延迟扩展的命令处理的参数列表:
瓦拉=“”
varb=B
varc=“C”
vard=Hello\Windows\System32
vare=C:\Windows
varf=C:\Windows\system32\wbem“F G”运算符:
varg=&()[]{}
varh=PATHEXT“M N
变量=I
varj=J
vark=K
varl=!PATHEXT!
varm=M
varn=N
使用命令SHIFT处理的参数列表:
瓦拉=“”
varb=B
varc=“C”
你好!
vare=“C:\Windows\System32;C:\Windows;C:\Windows\system32\wbem”
varf=F
varg=G
varh=“Operators:&()[]{}^=;!”+`~|"
变量=I
varj=J
vark=K
varl=“!”!可怜虫!"
varm=M
varn=N
父批处理文件定义的变量列表:
瓦拉=“”
varb=B
varc=“C”
你好!
vare=“%PATH%”
varf=F
varg=G
varh=运算符:&()[]{}^=;!'+,`~|
变量=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]
,…将使参数和变量的处理更加容易,因为整数可以轻松递增,而从列表中获取下一个字母则更难实现


另请参见。

请参见
shift/?
了解操作方法。这不是直截了当的。如果需要随机数,请参见帮助末尾的
设置/?
。我将在哪里放置shift/?阅读帮助并找到答案。您必须重写代码。您也可以使用for循环迭代
%*
。您只需复制文本输出并将其放在此处,无需captu你是一张截图