开发者社区> 问答> 正文

cmd.exe(批处理)脚本中的数组,链接列表和其他数据结构

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

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

set a=10 echo %a% 但是,我想创建数组,链表等。

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

我想将一些算法实现为:

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

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

导致其帮助未满:/?

Turing-Machine定义能否将Cmd.exe定义为完整?(图灵完成) 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 13:33:06 1186 0
1 条回答
写回答
取消 提交回答
  • 好。我会尽量清楚一点,不要被误解...

    在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,然后显示变量的值]。

    要解决此问题,必须使用Delayed Expansion,即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% 请注意,索引值不限于数字,而是可以是包含有效字符的任何字符串。这一点允许定义其他编程语言中的什么称为关联数组。在此答案中,将详细说明用于使用关联数组解决问题的方法。还要注意,空格是变量名中的有效字符,因此必须注意不要在变量名中插入可能不被注意的空格。

    我在这篇文章中详细说明了我必须在Batch文件中使用数组符号的原因。

    在这篇文章中,有一个批处理文件,该文件读取文本文件并将行的索引存储在向量中,然后根据行内容对向量元素进行大量排序;等效的结果是对文件内容进行排序。

    在这篇文章有基于存储在文件索引在批处理基本关系数据库应用程序。

    在这篇文章中,Batch中有一个完整的多个链表应用程序,该应用程序组装了一个从子目录获取的大型数据结构,并以TREE命令的形式显示。

    2020-02-09 13:33:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何使用Tair增强数据结构构建丰富在线实时场景 立即下载
Apache Flink 流式应用中状态的数据结构定义升级 立即下载
图数据库GDB——Gremlin介绍及范例 立即下载