我当时在玩cmd.exe,但在它的帮助下我没有找到任何有关如何定义数组的信息。

我发现了如何定义简单变量:

set a=10
echo %a%


但是,我想创建数组,链表等。

因此,它在cmd.exe中是否能够(我的意思是:cmd.exe中是否存在任何数组关键字?)

我想将一些算法实现为:


气泡排序
快速排序
侏儒排序


等等...

所以,我也想知道,Cmd.exe是否具有引用或实例,结构等?

导致其帮助未满:/?

Turing-Machine定义能否将Cmd.exe定义为完整? (图灵完成)

最佳答案

好。我会尽量清楚一点,不要被误解...

在Windows Batch文件中,变量名应以字母开头,并且可以包含任何有效字符,其中有效字符为:#$'()* +,-。?@ [] _`{}〜除字母和数字外。

这意味着从cmd.exe的角度来看,SET NORMAL_NAME=123SET 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命令的形式显示。

07-24 09:44
查看更多