我当时在玩cmd.exe,但在它的帮助下我没有找到任何有关如何定义数组的信息。
我发现了如何定义简单变量:
set a=10
echo %a%
但是,我想创建数组,链表等。
因此,它在cmd.exe中是否能够(我的意思是:cmd.exe中是否存在任何数组关键字?)
我想将一些算法实现为:
气泡排序
快速排序
侏儒排序
等等...
所以,我也想知道,Cmd.exe是否具有引用或实例,结构等?
导致其帮助未满:/?
Turing-Machine定义能否将Cmd.exe定义为完整? (图灵完成)
最佳答案
好。我会尽量清楚一点,不要被误解...
在Windows Batch文件中,变量名应以字母开头,并且可以包含任何有效字符,其中有效字符为:#$'()* +,-。?@ [] _`{}〜除字母和数字外。
这意味着从cmd.exe的角度来看,SET NORMAL_NAME=123
与SET A#$'()*+,-.?@[\]_{}~=123
完全相同,并且也与SET VECTOR[1]=123
相同。这三个都是正常变量。这样,由您决定以数组元素的形式编写变量名称:
set elem[1]=First element
set elem[2]=Second one
set elem[3]=The third one
这样,
echo %elem[2]%
将显示Second one
。如果要使用另一个变量作为索引,则必须知道,用百分号括起来的变量的值由左至右进行了解析;这意味着:
set i=2
echo %elem[%i%]%
无法给出理想的结果,因为它意味着:显示
elem[
变量的值,然后显示i
,然后显示]
变量的值。要解决此问题,必须使用延迟扩展,即在开始处插入
setlocal EnableDelayedExpansion
命令,将索引变量括在百分号中,并将数组元素括在感叹号中:setlocal EnableDelayedExpansion
set elem[1]=First element
set elem[2]=Second one
set elem[3]=The third one
set i=2
echo !elem[%i%]!
您也可以将FOR命令的参数用作索引:
for /L %%i in (1,1,3) do echo !elem[%%i]!
。您必须使用!index!当在FOR或IF内更改索引时,将值存储在数组元素中:set elem[!index!]=New value
。要在索引在FOR / IF内更改时获取元素的值,请用双百分号将元素括起来,并在命令前加上call
。例如,将一系列数组元素向左移动四个位置:for /L %%i in (%start%,1,%end%) do (
set /A j=%%i + 4
call set elem[%%i]=%%elem[!j!]%%
)
实现先前过程的另一种方法是使用附加的FOR命令通过等效的可替换参数更改索引的延迟扩展,然后将延迟扩展用于数组元素。此方法比以前的CALL运行得更快:
for /L %%i in (%start%,1,%end%) do (
set /A j=%%i + 4
for %%j in (!j!) do set elem[%%i]=!elem[%%j]!
)
这样,批处理文件的行为就像管理数组一样。我认为这里的重点不是讨论Batch是否管理数组,而是您可以用与其他编程语言等效的方式来管理Batch文件中的数组这一事实。
@echo off
setlocal EnableDelayedExpansion
rem Create vector with names of days
set i=0
for %%d in (Sunday Monday Tuesday Wednesday Thrusday Friday Saturday) do (
set /A i=i+1
set day[!i!]=%%d
)
rem Get current date and calculate DayOfWeek
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
set /A mm=10%%a %% 100, dd=10%%b %% 100, yy=%%c
)
if %mm% lss 3 set /A mm=mm+12, yy=yy-1
set /A a=yy/100, b=a/4, c=2-a+b, e=36525*(yy+4716)/100, f=306*(mm+1)/10, jdn=c+dd+e+f-1523, dow=jdn %% 7 + 1
echo Today is !day[%dow%]!, %date%
请注意,索引值不限于数字,而是可以是包含有效字符的任何字符串。这一点可以定义其他编程语言中称为associative arrays的内容。在this answer中,详细说明了用于使用关联数组解决问题的方法。还要注意,空格是变量名中的有效字符,因此必须注意不要在变量名中插入可能不被注意的空格。
我详细说明了必须在this post的批处理文件中使用数组表示法的原因。
在this post中,有一个批处理文件,该文件读取文本文件并将行的索引存储在向量中,然后根据行内容对向量元素进行Buble Sort;等效的结果是对文件内容进行排序。
在this post中,基于存储在文件中的索引,在批处理中有一个基本的关系数据库应用程序。
在this post中,Batch中有一个完整的多个链接列表应用程序,该应用程序组合从子目录中获取的大型数据结构并以TREE命令的形式显示。