我可以在批处理文件中声明一个列表或数组吗:
set list = "A B C D"
然后我需要将它们写入一个文件,之间有空格:
A
B
C
D
是的,两种方式都可以使用。如果您只想分隔元素并在分隔行中显示它们,则列表更简单:
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
有时候数组元素可能会很长,这时候你可以这样创建数组:
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/
)
@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(
的问题是结果“看起来”不平衡。
我喜欢这样:
set list=a;^
b;^
c;^
d;
for %%a in (%list%) do (
echo %%a
echo/
)
批处理文件中没有“数组”类型,这有时既有利又不利,但有解决方法。
这里有一个链接,提供了一些建议,帮助您自己创建类似于批量数组的系统:http://hypftier.de/en/batch-tricks-arrays。
echo variable >> filepath
适用于将变量的内容回显到文件,echo.
(句点不是拼写错误)用于回显换行符。我认为这两者应该共同努力来完成你所需要的。
搭建环境
@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]!
)
@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%]!
这是我创建的 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