草庐IT

cmd.exe(批处理)脚本中的数组、链表等数据结构

coder 2023-11-08 原文

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

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

set a=10
echo %a%

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

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

我想实现一些算法:

  • 冒泡排序
  • 快速排序
  • 侏儒排序

等...

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

因为它的帮助没有全在:/?

Cmd.exe 能否被图灵机定义为完整的? (图灵完备)

最佳答案

好的。我会尽量说清楚,以免被误解......

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

这意味着从 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]% 将显示第二个

如果你想使用另一个变量作为索引,你必须知道用它们的值替换用百分号括起来的变量是从左到右解析的;这意味着:

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%

请注意,索引值不限于数字,可以是任何包含有效字符的字符串;这一点允许定义在其他编程语言中称为 associative arrays 的内容.在 this answer对使用关联数组解决问题的方法有详细的解释。另请注意,空格是变量名中的有效字符,因此您必须注意不要在可能被忽视的变量名中插入空格。

我在 this post 详细说明了我必须在批处理文件中使用数组符号的原因。 .

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

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

this post Batch 中有一个完整的多链表应用程序,它可以组装从子目录中获取的大型数据结构,并以 TREE 命令的形式显示。

关于cmd.exe(批处理)脚本中的数组、链表等数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10166386/

有关cmd.exe(批处理)脚本中的数组、链表等数据结构的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  8. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  9. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  10. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

随机推荐