创建列表或数组并在 Windows Batch 中打印每个项目

问题描述 投票:0回答:8

我可以在批处理文件中声明一个列表或数组吗:

set list = "A B C D"

然后我需要将它们写入一个文件,之间有空格:

A

B

C 

D
windows batch-file
8个回答
144
投票

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

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


57
投票

有时候数组元素可能会很长,这时候你可以这样创建数组:

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/
)

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

你不需要——实际上,不能批量“声明”变量。为变量分配一个值会创建它,分配一个空字符串会删除它。任何没有分配值的变量名称都具有空字符串值。所有变量都是字符串——无一例外。有些运算看似执行(整数)数学函数,但它们是通过字符串来回转换来进行操作的。

Batch 对变量名称中的空格敏感,因此您发布的分配会将字符串

"A B C D"
- 包括引号,分配给变量
"list "
- 不包括引号,但包括空格。语法
set "var=string"
用于将值
string
分配给
var
,而
set var=string
会执行相同的操作。几乎。在第一种情况下,结束引号后的任何杂散尾随空格都会从分配的值中排除,在第二种情况下,它们会被包含在内。打印时空格有点难以看清。

ECHO
与弦乐相呼应。通常,它后面跟着一个空格 - 批处理使用的默认分隔符之一(其他是制表符、逗号、分号 - 这些中的任何一个都可以,但是制表符经常被文本编辑器转换为空格序列,并且多年来,其他人也有了自己的怪癖。)
O
ECHO
后面的其他字符被发现精确地执行了记录的 SPACE 应该执行的操作。 DOT 很常见。左括号
(
可能是自命令

以来最有用的
ECHO.%emptyvalue%

将生成

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

ECHO(%emptyvalue%

将产生一个空行。

ECHO(
的问题是结果“看起来”不平衡。


5
投票

我喜欢这样:

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


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

5
投票

数组类型不存在

批处理文件中没有“数组”类型,这有时既有利又不利,但有解决方法。

这里有一个链接,提供了一些建议,帮助您自己创建类似于批量数组的系统:http://hypftier.de/en/batch-tricks-arrays

  • 至于回显到文件
    echo variable >> filepath
    适用于将变量的内容回显到文件,
  • echo.
    (句点不是拼写错误)用于回显换行符。

我认为这两者应该共同努力来完成你所需要的。

进一步阅读


4
投票

搭建环境

@echo off
setlocal enabledelayedexpansion

创建列表

set items[0]=First
set items[1]=Second
set items[2]=Third
set items[3]=Fourth
set items[4]=Fifth

从列表中选择

%items[1]%

显示列表中的项目

echo %items[1]%

询问用户选择(列表中的键)并返回相应的项目

set /p choice="Enter choice:
echo !items[%choice%]!

显示列表。括号中的幻数是:

0
数组的起始索引。
1
步骤。
4
最后一项。
%%i
是您的索引。

for /L %%i in (0,1,4) do (
    echo !items[%%i]!
)

0
投票
@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%]!

0
投票

这是我创建的 2 个函数,允许您创建一个列表,我在 setlocal 方面遇到了一些问题,所以我使用了文件,我知道这不好,但希望它对您有用

@echo off
rem exemple: set "<name_list>=*list:<items>" & call :funclist "<name_list>"

set "super_list=*list:a b c d" & call :funclist "super_list"

setlocal EnableDelayedExpansion
for /L %%i in (0, 1, %super_list[len]%) do (
    echo super_list[%%i]: !super_list[%%i]!
)
endlocal

pause
exit

:funclist
    set "varlist=%~1"
    set "list_sig=*list:"
    set "var_file=%cd%\%random%%random%.tmp"
    setlocal EnableDelayedExpansion
    if not "!%varlist%:~0,6!" == "%list_sig%" (goto :eof)
    set "list=!%varlist%:%list_sig%=!"

    set /a "index=0"
    for %%a in (!list!) do (
        set "%varlist%[!index!]=%%a"
        set /a "index+=1"
    )

    set /a "index-=1"

    for /L %%i in (0, 1, !index!) do (
        for /f "delims=" %%A in ("!%varlist%[%%i]!") do (
            echo %varlist%[%%i]=%%A>>!var_file!
        )
        echo %varlist%[len]=!index!>>!var_file!
    )
    endlocal

    for /f "delims=" %%a in (%var_file%) do (endlocal & call :global "%%a" "=")

    del /q "%var_file%"

    set "varlist="
    set "list_sig="
    set "var_file="
    goto :eof

:global
    set "global_varval=%~1"
    set "global_split=%~2"

    set "file_var=%cd%\%random%%random%.tmp"
    set "file_val=%cd%\%random%%random%.tmp"

    for /f "tokens=1 delims=%global_split%" %%v in ("%global_varval%") do (echo %%v>%file_var%)
    for /f "tokens=2 delims=%global_split%" %%v in ("%global_varval%") do (echo %%v>%file_val%)

    <"%file_var%" (set /p "split1=")
    <"%file_val%" (set /p "split2=")

    del /q "%file_var%"
    del /q "%file_val%"

    set "%split1%=%split2%"

    set "file_var="
    set "file_val="
    set "global_varval="
    set "global_split="
    set "split1="
    set "split2="
    goto :eof
© www.soinside.com 2019 - 2024. All rights reserved.