如何从 1 数到 50 并将每个数字设置为批处理文件中的变量?
Posted
技术标签:
【中文标题】如何从 1 数到 50 并将每个数字设置为批处理文件中的变量?【英文标题】:How to count from 1 to 50 and set each number as a variable in Batch file? 【发布时间】:2021-08-14 06:00:06 【问题描述】:Good Day,我这里有一个使用函数来操作的批处理脚本
@echo off
setlocal enableDelayedExpansion
:INSTALLER
set "n1=7_Zip"
set "n2=Adobe_Products"
set "n3=Allavsoft"
set "n4=Astute_Graphics"
set "n5=AutoHotkey"
set "n6=Backup_and_Sync_from_Google"
set "n7=BlueStacks_5_Beta"
set "n8=CC_Cleaner"
set "n9=Core_Temp"
set "n10=CPUID_CPU-Z"
我遇到了麻烦,因为我希望变量 n1
n2
...10
是依赖的,这意味着我希望它像这样 !n%c%!
(其中 %c%
是 @ 后面的数字987654328@) 所以当我在两个程序之间插入一个新程序时,编号将被移动。例如,我将在CC_cleaner
和Core_Temp
之间插入Notepad++
。现在,当我插入 Notepad++
时,它的编号将是 Core_Temp
的旧编号,即 9
,Core_Temp
的新编号将是 10
,CPUID_CPU-Z
的新编号将是 11。我只是不知道在哪里可以将变量 1
2
... 11
替换为 %c% 的值。我正在考虑一个for loop
,它将从 1 计数到 50,并将每个数字设置为一个变量,以便我可以将这些变量替换为 %c%
的值,但我不知道如何实现。
除了for loop
之外,我也愿意接受其他选择
【问题讨论】:
这能回答你的问题吗? Arrays, linked lists and other data structures in cmd.exe (batch) script @Squashman - 我在那个问题上看不到任何可以帮助我的答案,你能指导我具体的答案是什么吗? 我建议您通读得票最多的答案。因为这是我们在每个人有关于数组的问题时引导他们的答案。它很好地解释了如何在批处理文件中执行此操作 谢谢你,我一定会期待着寻找那个 【参考方案1】:使用函数来定义数组。这样做时,只需将新值添加到调用函数的参数值列表中。
编辑:鉴于提供的使用示例和函数的参数结构的描述,我不确定有什么不清楚的地方,所以这里是对函数功能的描述:
在您的开场问题中,您手动定义了一个前缀为 n
的数组,后跟一个数字索引:
set "n1=7_Zip"
set "n2=Adobe_Products"
set "n3=Allavsoft"
set "n4=Astute_Graphics"
set "n5=AutoHotkey"
set "n6=Backup_and_Sync_from_Google"
set "n7=BlueStacks_5_Beta"
set "n8=CC_Cleaner"
set "n9=Core_Temp"
set "n10=CPUID_CPU-Z"
上述将每个值硬编码到索引的方法使得将值添加到数组的开头/中间非常耗时,因为必须手动更新每个 n#
。
而不是逐行硬编码每个值,下面的函数将一个列表(或一系列列表)作为包含数组名称(%1, the first argument
)和要定义到数组的值(所有其他参数)的参数,将列表分配给一个变量,以便将数组名称与要定义的值分开,然后使用For
循环遍历这些值,增加数组的唯一索引,然后将列表中的当前值分配给适当的索引。
这允许使用以下调用来实现上述定义:
Call :DefineArray n 7_Zip Adobe_Products Allavsoft Astute_Graphics AutoHotkey Backup_and_Sync_from_Google BlueStacks_5_Beta CC_Cleaner Core_Temp CPUID_CPU-Z
示例输出(带有Set n.
):
n.1=7_Zip
n.10=CPUID_CPU-Z
n.2=Adobe_Products
n.3=Allavsoft
n.4=Astute_Graphics
n.5=AutoHotkey
n.6=Backup_and_Sync_from_Google
n.7=BlueStacks_5_Beta
n.8=CC_Cleaner
n.9=Core_Temp
注意事项:
该函数使用数组前缀名称的附加.
后缀定义数组变量(即:n.1 n.2
...)。这样做是为了允许在使用 Set
命令时将数组与以与数组变量名称相同的前缀开头的其他环境变量区分开来。
函数在调用时不会将数组的索引计数归零。这允许定义值的调用分布在多行中,以便于维护和可读性。
@Echo off
:# prepare envarinoment for use of '!' expansion during code blocks
:# '!' expansion allows access of variables whose name contains other variables
:# and provides protection against batch poison characters
Setlocal EnableExtensions EnableDelayedExpansion
:# Calls the label DefineArray with parameters; doublequoting any string containing
:# standard delimiters
Call :DefineArray arrayname value1 "value 2"
:# Display defined variables prefixed with arrayname
Set arrayname
Goto :Eof
:# Function label name and arg structure
:DefineArray groupname list of values
:# Define all paramters to Params with leading whitespace used to remove groupname from parameter list.
Set ^"Params= %*"
:# Remove the groupname from the list of elements to be assigned
Set "Params=!Params: %1 =!"
:# Initialise array index variable specific to the groupname;
:# [If not already incremented]
Set /A "%~1[i]+=0"
:# iterate over Params list; increment group index count; Assign element
:# to groupname.index
For %%G in (!Params!)Do (
Set /A "%~1[i]+=1"
Set "%~1.!%~1[i]!=%%~G"
)
:# exit function
Exit /b 0
注意:上面使用的方法将消耗由于Delayed expansion
而出现在值中的任何!
字符。
【讨论】:
谢谢你的回答,能不能具体解释一下。我不明白这部分脚本@Echo off Setlocal EnableExtensions EnableDelayedExpansion Call :DefineArray arrayname value1 "value 2" Set arrayname Goto :Eof :DefineArray groupname list of values :# leading whitespace used to remove groupname from parameter list. Set ^"Params= %*" Set "Params=!Params: %1 =!"
我正在练习批处理文件至少 2 周,并且我设法理解了一些脚本。
答案已更新,并添加了解释每个步骤的注释。有关每个命令的更多信息,请打开 cmd.exe
并输入:commandname /?
或访问 ss64 并查看您希望学习的命令的链接。 ss64 包含大多数命令的附加用法示例和信息。
非常感谢,如果可以的话,我可以阅读哪些资源/书籍以便更好地处理批处理文件?
有一个内置的help
命令,如果命令窗口太小而无法阅读,那么所有相同的信息也在 ss64.com 上。以上是关于如何从 1 数到 50 并将每个数字设置为批处理文件中的变量?的主要内容,如果未能解决你的问题,请参考以下文章