在Windows Batch中创建列表或数组


74

我可以像这样在批处理文件中声明列表或数组:

set list = "A B C D"

然后我需要将它们写到文件中,并在它们之间留有空格:

A

B

C 

D

Answers:


121

是的,您可以同时使用两种方式。如果您只想分隔元素并以分隔线显示它们,则列表会更简单:

set list=A B C D

用空格分隔的值列表可以通过以下for命令轻松处理:

(for %%a in (%list%) do (
   echo %%a
   echo/
)) > theFile.txt

您也可以通过以下方式创建数组:

setlocal EnableDelayedExpansion
set n=0
for %%a in (A B C D) do (
   set vector[!n!]=%%a
   set /A n+=1
)

并以这种方式显示数组元素:

(for /L %%i in (0,1,3) do (
   echo !vector[%%i]!
   echo/
)) > theFile.txt

有关批处理文件中阵列管理的更多详细信息,请参阅:cmd.exe(批处理)脚本中的阵列,链接列表和其他数据结构

注意!您必须知道set命令中包含的所有字符都已插入变量名称(等号左侧)或变量值中。例如,此命令:

set list = "A B C D"

创建一个list具有值"A B C D"(空格,引号,A等)的变量(列表空间)。因此,最好不要在set命令中插入空格。如果需要将值用引号引起来,则必须将变量名及其值都包括在内:

set "list=A B C D"

PS-请勿使用ECHO.以留空行!另一种选择是ECHO/。有关此点的更多详细信息,请参见:http : //www.dostips.com/forum/viewtopic.php?f=3&t=774


是的...我正在寻找的vector [i]!谢谢!
JasonXA

3
如果您使用for /L %%i in (0,1,%n%)它,应该把它们全部都得到,而不仅仅是前
Jesse Chisholm

在我的情况下,我发现n不会保留在循环之外,使用'3'将向量过冲1,因此“ 0,1,2”似乎是正确的,而使用简单的“ set list = ab c”并没有处理* .dll等更复杂的数据。我想要一个文件扩展名列表。
bduhbya

@JesseChisholm:不直接。您需要set /A n-=1在第二个命令之前执行命令for。因此,最好将数组创建为base-1(从1到n,而不是从0到n-1)。
阿萨尼(Aacini)

31

有时array元素可能很长,这时您可以按以下方式创建数组:

set list=a
set list=%list%;b 
set list=%list%;c 
set list=%list%;d

然后显示它:

@echo off
for %%a in (%list%) do ( 
 echo %%a
 echo/
)

这是IMO的真正权利。这真的是我一直在寻找的东西,似乎与其他语言最接近,因此也是我期望看到的。.Thx
Mike Q

19
@echo off
setlocal
set "list=a b c d"
(
 for %%i in (%list%) do (
  echo(%%i
  echo(
 )
)>file.txt

您不需要-实际上,不能批量“声明”变量。给变量赋值会创建它,而给一个空字符串赋值会删除它。没有赋值的任何变量名都具有空字符串的值。所有变量都是字符串-没有异常。ARE操作似乎执行(整数)数学功能,但是它们通过从字符串来回转换来进行操作。

批处理对变量名称中的空格敏感,因此发布的分配会将字符串"A B C D"(包括引号)分配给变量"list "-不包括引号,但包括空格。该语法set "var=string"用于将值分配给stringvarset var=string将执行相同的操作。几乎。在第一种情况下,在结束引号之后的任何结尾的空格均从分配的值中排除,在第二种情况下,将其包括在内。打印时很难看到空格。

ECHO回显字符串。通常,它后面跟一个空格-批处理使用的默认分隔符之一(其他分隔符是TAB,COMMA和SEMICOLON-这些分隔符中的任何一个都一样,但是文本编辑器通常会将TABS转换为空格,这些年来,其他字符也变得越来越怪异。)已发现跟随Oin的其他字符ECHO确实可以完成所记录的SPACE应该执行的操作。DOT很常见。(自命令以来,左括号可能是最有用的

ECHO.%emptyvalue%

将产生ECHO状态(ECHO is on/off)的报告,而

ECHO(%emptyvalue%

将产生一个空行。

问题ECHO(在于结果“看起来”不平衡。


2

数组类型不存在

批处理文件中没有“数组”类型,有时既有好处也有缺点,但是有解决方法。

这是一个链接,提供了一些有关为自己创建类似于批处理阵列的系统的建议:http : //hypftier.de/en/batch-tricks-arrays

  • 至于回显文件echo variable >> filepath是为了将变量内容回显到文件,
  • 并且echo.(句号不是错字)可用于回声换行符。

我认为这两个应该一起完成您所需要的。

进一步阅读


-2
@echo off

set array=

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set nl=^&echo(

set array=auto blue ^!nl!^
  bycicle green ^!nl!^
  buggy   red

echo convert the String in indexed arrays

set /a index=0

for /F "tokens=1,2,3*" %%a in ( 'echo(!array!' ) do (

 echo(vehicle[!index!]=%%a color[!index!]=%%b 
 set vehicle[!index!]=%%a
 set color[!index!]=%%b
 set /a index=!index!+1   

)

echo use the arrays

echo(%vehicle[1]% %color[1]%
echo oder

set index=1
echo(!vehicle[%index%]! !color[%index%]!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.