Batch file 在批处理脚本中,如何;跳过空参数";?

Batch file 在批处理脚本中,如何;跳过空参数";?,batch-file,cmd,Batch File,Cmd,示例脚本call.bat a)现在,如果我用 c:\>call Huey Dewey Louie 它会打印出来的 Huey.txt Dewey.txt Louie.txt b)如果我用 c:\>call Huey Dewey 它会打印出来的 Huey.txt Dewey.txt .txt 如果我没有给出%3,如何让它跳过最后一部分?(当然,参数的数量可以超过三个,…比方说8个或9个)。call.bat :label echo %1.txt SHIFT if not "%1"

示例脚本call.bat

a)现在,如果我用

c:\>call Huey Dewey Louie
它会打印出来的

Huey.txt Dewey.txt Louie.txt
b)如果我用

c:\>call Huey Dewey
它会打印出来的

Huey.txt Dewey.txt .txt
如果我没有给出%3,如何让它跳过最后一部分?(当然,参数的数量可以超过三个,…比方说8个或9个)。

call.bat

:label
echo %1.txt
SHIFT
if not "%1" == "" goto label
这就是你要找的吗? 您可能希望在每个命令“@”之前设置命令的回显,或在脚本开头设置“@echo off”。

call.bat

:label
echo %1.txt
SHIFT
if not "%1" == "" goto label
这就是你要找的吗?
您可能希望设置命令的回显,以便在每个命令“@”之前或在脚本开头设置“@echo off”。

我假设您希望在一行中输出所有命令,如示例所示。如果是这样,这里有一种方法:

测试蝙蝠

@echo off
set cmd=echo
for %%A in (%*) do call :Add %%A
%cmd%
goto:EOF

:Add
set cmd=%cmd% %1.txt
goto:EOF
看起来像这样:

C> test 1 2 3 4 5
1.txt 2.txt 3.txt 4.txt 5.txt
C>

这并不能很好地处理没有提供任何参数的情况(它只会说“Echo已打开”),但IF测试可以解决这个问题。

我假设您希望在一行上输出所有参数,如示例所示。如果是这样,这里有一种方法:

测试蝙蝠

@echo off
set cmd=echo
for %%A in (%*) do call :Add %%A
%cmd%
goto:EOF

:Add
set cmd=%cmd% %1.txt
goto:EOF
看起来像这样:

C> test 1 2 3 4 5
1.txt 2.txt 3.txt 4.txt 5.txt
C>


这不能很好地处理没有提供任何参数的情况(它只会说“Echo已打开”),但IF测试可以解决这一问题。

但这需要9个可选参数的9个标签,不是吗?9个可选参数是什么意思?我可以用“call one 2 three”(三个参数)调用脚本,但我也可以用“调用一两个”或“调用一个”(一个参数)。并非所有%1…%9分。所以,如果你的脚本中有9个可能的参数,我就必须写9个可能的标签。不是真的。SHIFT cmd将用%2替换%1,用%3替换%2。。。所以它会接受1,2,3。。。或9个参数。你应该试试看。例如:给定%1=the、%2=quick、%3=brown班次将导致%1=quick、%2=brown第二班次将导致%1=brownNo,Delk的答案如图所示;不需要更多标签(查看SHIFT命令的作用)。但是,它将每个文件输出到单独的一行上--不确定这是否是您想要的。但这需要9个标签来表示9个可选参数,不是吗?9个可选参数是什么意思?我可以用“call one 2 three”(三个参数)来调用脚本,但也可以用“call one 2”或“call one”(一个参数)来调用脚本。并非所有%1…%9分。所以,如果你的脚本中有9个可能的参数,我就必须写9个可能的标签。不是真的。SHIFT cmd将用%2替换%1,用%3替换%2。。。所以它会接受1,2,3。。。或9个参数。你应该试试看。例如:给定%1=the、%2=quick、%3=brown班次将导致%1=quick、%2=brown第二班次将导致%1=brownNo,Delk的答案如图所示;不需要更多标签(查看SHIFT命令的作用)。但是,它将每个文件输出到单独的一行上——不确定这是否是您想要的。当5.txt之后出现某些内容时,是否可以修改该行?不管有多少个参数。它将循环通过所有这些。%%A in(%*)的
是一个循环,每个参数运行一次。请使用ECHO(而不是ECHO来消除“ECHO is off”。请注意,ECHO(比ECHO.form更安全,尽管它看起来会导致括号不平衡。@chrisd-我的意思是,5.txt之后的内容不是参数。我知道循环:)你的意思是要在参数列表后添加其他内容吗?只需在
for
循环后添加
set cmd=%cmd%whatever
。如果在5.txt之后有内容,是否可以修改该行?不管有多少个参数。它将循环所有参数。对于%%A in(%%*)
是一个循环,每个参数运行一次。请使用ECHO(而不是ECHO来消除“ECHO is off”。请注意,ECHO(比ECHO.form更安全,尽管它看起来会导致括号不平衡的问题。@chrisd-我的意思是,5.txt之后的内容不是参数。我知道循环:)您的意思是要在参数列表之后添加其他内容?只需在for循环的
之后添加
set cmd=%cmd%whatever
。我建议不要命名批处理文件CALL.BAT(或任何其他现有命令名!)@dbenham-是的,很好的观点…它并不是真的叫那个。TWA只是这个例子,因为我懒得想更好的东西。我建议不要给批处理文件命名CALL.BAT(或任何其他现有的命令名!)@dbenham-是的,很好的观点…它不是真的叫那个。TWA只是这个例子,因为我懒得想更好的东西。