cmd.exe(批处理)脚本中的数组,链表和其他数据结构 [英] Arrays, linked lists and other data structures in cmd.exe (batch) script

查看:202
本文介绍了cmd.exe(批处理)脚本中的数组,链表和其他数据结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我找到了,如何定义简单变量:

 设置a = 10 
echo%a%



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



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



我想实现一些算法:




  • 气泡排序

  • 快速排序

  • gnome排序



等...



所以,我也想知道,Cmd.exe有引用



可以Cmd.exe是否正在运行?

定义为完全由图灵机定义? (Turing-Complete)

解决方案

确定。



在Windows批处理文件中,变量名应以并且可以包括任何有效字符,其中有效字符是:#$'()* +, - 。@ [] _`{}〜除字母和数字之外。
$ b

这意味着从cmd.exe的角度来看, SET NORMAL_NAME = 123 SET完全相同A#$'()* +, - 。?@ [\] _ {}〜= 123 ,同样 SET VECTOR [1] = 123 ;所有三个都是正常变量。

 这样,就可以用数组元素的形式写出变量名: set elem [1] =第一个元素
set elem [2] =第二个
set elem [3] =第三个

这样, echo%elem [2]%将显示第二个



如果您想使用另一个变量作为索引,您必须知道用百分比符号替换变量从左到右解析;这意味着:

  set i = 2 
echo%elem [%i%]%

没有给出所需的结果,因为它意味着:显示 elem [ code>变量,后跟 i ,后跟] 变量的值。



要解决这个问题,您必须使用延迟扩展,即插入 setlocal EnableDelayedExpansion 开始,用百分比符号括起索引变量,并用感叹号将数组元素括起来:

  setlocal EnableDelayedExpansion 
set elem [1] =第一个元素
set elem [2] =第二个
set elem [3] =第三个
set i = 2
echo!elem [%i% ]!

您也可以使用FOR命令的参数作为索引: for / L% %i in(1,1,3)do echo!elem [%% i]!。你必须使用!当在FOR或IF中更改索引时,在数组元素中存储值: set elem [!index!] =新值。要在FOR / IF中更改索引时获取元素的值,请用双百分比符号括住该元素,并在命令前加上 call 。例如,要将数组元素范围向左移动四个位置:

 用于/ L %% i %,1,%end%)do(
set / A j = %% i + 4
call set elem [%% i] = %% elem [!j!] %%

另一种实现上一个过程的方法是使用一个额外的FOR命令来更改延迟扩展的索引通过等效的可替换参数,然后使用数组元素的延迟扩展。此方法的运行速度比以前的CALL快:

 用于/ L %% i(%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创建向量名称为
set i = 0
for %% d(星期日星期一星期二星期三星期三星期五星期六星期六)do(
set / A i = i + 1
set day [!i!] = %% d

b $ b rem获取当前日期并计算DayOfWeek
for / Ftokens = 1-3 delims = /%% a in(%date%)do(
set / A mm = 10如果%mm%lss 3 set / A mm = mm + 12,yy = yy-1,则y%= %% b %% 100,yy = %% c
) 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%

请注意,索引值不限于数字,但它们可以是包含有效字符的任何字符串;此点允许定义在其他编程语言中称为关联数组的内容。在此答案上,有一个用于使用关联数组解决问题的方法的详细解释。还要注意,空格是变量名中的有效字符,因此您必须注意不要在变量名中插入空格,否则可能会被忽略。



我详细说明了原因我必须在批处理文件中使用数组符号,在此帖。 / p>

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



这个帖子基于存储在文件中的索引,在Batch中有一个基本的关系数据库应用程序。



此帖子在Batch中有一个完整的多个链接列表应用程序,它组装了一个大型数据结构a子目录并以TREE命令的形式显示它。


I was playing with cmd.exe, but in its help I didn't find any info, how to define arrays.

I have found, how to define simple variables:

set a = 10
echo %a%

But, I want to create arrays, linked list etc...

So, does it able in cmd.exe ( I mean: does in cmd.exe exist any array keywords? )

I want to realize some algorithms as:

  • bubble sort
  • quick sort
  • gnome sort

etc...

So, I also want to know, does Cmd.exe have references or instances, structs etc?

Cause its help not full in: /?

Could Cmd.exe be defined as full by Turing-Machine definition? ( Turing-Complete )

解决方案

Ok. I'll try to be as clear as possible to not be misunderstood...

In Windows Batch files a variable name should begin with a letter and may include any valid character, where valid characters are: #$'()*+,-.?@[]_`{}~ besides letters and digits.

This means that from the cmd.exe point of view, SET NORMAL_NAME=123 is exactly the same as SET A#$'()*+,-.?@[\]_{}~=123 and also the same as SET VECTOR[1]=123; all three are normal variables. This way, it is up to you to write variable names in the form of array elements:

set elem[1]=First element
set elem[2]=Second one
set elem[3]=The third one

This way, echo %elem[2]% will show Second one.

If you want to use another variable as index, you must know that the replacement of variables enclosed in percent symbols by their values is parsed from left to right; this means that:

set i=2
echo %elem[%i%]%

doesn't give the desired result because it means: show the value of the elem[ variable, followed by i, followed by the value of the ] variable.

To solve this problem you must use Delayed Expansion, that is, insert setlocal EnableDelayedExpansion command at the beginning, enclose index variables in percent symbols, and enclose the array elements in exclamation marks:

setlocal EnableDelayedExpansion
set elem[1]=First element
set elem[2]=Second one
set elem[3]=The third one
set i=2
echo !elem[%i%]!

You may also use parameters of FOR commands as indexes: for /L %%i in (1,1,3) do echo !elem[%%i]!. You must use !index! to store values in array elements when the index is changed inside a FOR or IF: set elem[!index!]=New value. To get the value of an element when the index changes inside FOR/IF, enclose the element in double percent symbols and precede the command with call. For example, to move a range of array elements four places to the left:

for /L %%i in (%start%,1,%end%) do (
   set /A j=%%i + 4
   call set elem[%%i]=%%elem[!j!]%%
)

Another way to achieve the previous process is to use an additional FOR command to change the delayed expansion of the index by an equivalent replaceable parameter, and then use the delayed expansion for the array element. This method runs faster than previous CALL:

for /L %%i in (%start%,1,%end%) do (
   set /A j=%%i + 4
   for %%j in (!j!) do set elem[%%i]=!elem[%%j]!
)

This way, the Batch file behaves like it manages arrays. I think the important point here is not to discuss if Batch manages arrays or not, but the fact that you may manage arrays in Batch files in an equivalent way of other programming languages.

@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%

Note that index values are not limited to numbers, but they may be any string that contain valid characters; this point allows to define what in other programming languages are called associative arrays. At this answer there is a detailed explanation of the method used to solve a problem using an associative array. Note also that the space is a valid character in variable names, so you must pay attention to not insert spaces in variable names that may go unnoticed.

I elaborated on the reasons I have to use array notation in Batch files at this post.

In this post there is a Batch file that reads a text file and stores the indexes of the lines in a vector, then does a Buble Sort of vector elements based on line contents; the equivalent result is a sort over file contents.

In this post there is a basic Relational Data Base application in Batch based on indexes stored in files.

In this post there is a complete multiple linked-list application in Batch that assembles a large data structure taken from a subdirectory and displays it in the form of TREE command.

这篇关于cmd.exe(批处理)脚本中的数组,链表和其他数据结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆