如何将一个字符串列表作为参数传递给批处理脚本?

7
我的批处理脚本用于处理一系列字符串,我希望将其参数化,以便从用户那里接受此列表作为参数。
这是目前我的代码如何处理此列表的方式:
set QUEUES=cars plans others
FOR %%q IN (%QUEUES%) DO Call :defineQueues %%q

我该如何将这个列表作为参数传递给QUEUES变量呢?
比如说,我该如何将它传递给这个脚本:
myScript.bat ?
5个回答

15

你必须使用引号将字符串括起来:

myScript.bat "cars plans others"

然后,%1 将等于 "cars plans others"

或者使用 %~1% 来移除引号并仅获取 cars plans others

否则,您将获得3个不同的参数值:

myScript.bat cars plans others

%1 => cars
%2 => plans
%3 => others

2

对不起,我看到这个问题,忍不住想澄清一些问题。

批处理文件通常会接收多个参数,比如这些:

myScript.bat cars plans others

之前的批处理文件接收3个参数,可以通过%1、%2和%3进行常规处理。如果您想让单个参数接收多个单词,则所有单词都必须用引号括起来:

myScript.bat "cars plans others"

之前的批处理文件只接收一个包含多个单词的参数,可以通过 %1 进行处理。请注意,以下几行与之前的示例完全相同:

set QUEUES=cars plans others
myScript.bat %QUEUES%

之前的批处理文件接收了3个参数,并且:

myScript.bat "%QUEUES%"

...之前的批处理文件只接收一个参数。


列表是一个包含多个由空格分隔的值的变量,就像这个:

set QUEUES=cars plans others

您可以将这个列表作为参数传递给批处理文件:

myScript.bat QUEUES

之前的批处理文件接收一个参数,即一个列表变量。要在 myScript.bat 中处理列表的值,请使用以下方法:

setlocal EnableDelayedExpansion
FOR %%q in (!%1!) DO echo %%q

数组是由数个元素组成的变量,每个元素都有对应的数字下标进行标识,例如以下这个例子:

set NAMES[1]=cars
set NAMES[2]=plans
set NAMES[3]=others

数组通常有一种简单的方法来知道它包含的元素数量;例如:

set NAMES.length=3

您可以将这个字符串数组作为参数传递给批处理文件,方法如下:

您可以将这个字符串数组作为参数传递给批处理文件。

myScript.bat NAMES

之前的批处理文件接收一个参数,该参数是一个数组。要在 myScript.bat 中处理数组的元素,请使用以下方法:

setlocal EnableDelayedExpansion
FOR /L %%i in (1,1,!%1.length!) DO echo !%1[%%i]!

感谢您对此进行精确的澄清。 - Yair Nevet

0
如果您想让您的脚本以这种方式使用:
myScript.bat "cars plans others"

你可以尝试以这种方式编程:
setlocal EnableDelayedExpansion

set string_of_strings = (%~1) // %1 is: "cars plans others", %~1" is: cars plans others", (%~1) is: (cars plans others)
for %%i in %string_of_strings% do echo %%i%NL%

关键在于,%1 是字符串类型,但 string_of_strings 是字符串数组类型。


0

或者,如果你只是在命令行上传递了QUEUES的值,你可以使用%*批处理文件运算符,它是对该行上所有参数的通配符引用。

@echo off
FOR %%q IN (%*) DO echo %%q

按照以下方式执行批处理文件:

x.bat cars plans others

输出结果为:

C:\junk>x.bat cars plans others
cars
plans
others

C:\junk>

如果您在命令中与QUEUES元素一起传递任何其他参数,将其他参数“移出”并不是那么简单。


谢谢,但我正在传递多个参数。无论如何,还是很有用的! - Yair Nevet

0
你可以将其称为myScript.bat %QUEUES%,并使用以下代码在你的myScript.bat中获取它:
setlocal EnableDelayedExpansion
FOR %%q in (!%1!) DO echo %%q

1
在发布代码时,请考虑使用适当的格式:代码应该缩进4个空格,行内代码应该用“`”括起来。 - user1143634
@Ivan 感谢您纠正格式。我是新来的,刚开始帮助他人。 - Vinita Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接