使用索引 Batch 在 for 循环中设置变量

Posted

技术标签:

【中文标题】使用索引 Batch 在 for 循环中设置变量【英文标题】:Setting a variable within a for loop using the index Batch [duplicate] 【发布时间】:2019-07-05 22:46:46 【问题描述】:

我正在尝试在 for 循环中设置一个全局变量来唱索引。 然后我想打破循环并打印出那个值。代码如下:

SetLocal EnableDelayedExpansion
for %%d in (z y x w v u t s r q p o n m l k j i h g f e d c) do (
set letter = %%d
if exist %%d:\ (echo nothing) else (goto break)
)

:break
echo %letter%
timeout 30

由于某种原因,我无法回显%letter% 的值 我做错了什么?

【问题讨论】:

【参考方案1】:

为什么= 前后有空格?这将创建一个名为%letter %(尾随空格)的变量和一个d(前导空格)的值

SetLocal EnableDelayedExpansion
for %%d in (z y x w v u t s r q p o n m l k j i h g f e d c) do (
  set "letter=%%d"
  if exist %%d:\ (
       echo nothing
      ) else (
       goto break
     )
 )

:break
echo %letter%
timeout 30

您需要从脚本中了解一件事,如果任何驱动器不存在,它将退出循环,回显它并且不会返回循环。如果这是您的计划,那么很好, 否则,call 标签,而是去掉标签并在循环的else 部分运行代码。

或者更好的选择:

@echo off
for %%d in (z y x w v u t s r q p o n m l k j i h g f e d c) do (
 if not exist %%d:\ echo %%d & timeout 30
)

如果您不想为每个不存在的结果等待 30 秒,您可以删除 & 并将 timeout 30 语句移动到最后一个括号下方,例如:

@echo off
for %%d in (z y x w v u t s r q p o n m l k j i h g f e d c) do (
 if not exist %%d:\ echo %%d
)
timeout 30

【讨论】:

【参考方案2】:

由于您的最小代码示例目前对我来说意义不大,Gerhard Barnard 也提到过,我决定发布一些代码 sn-ps 供您参考。

我更喜欢使用Mountvol 来处理这类事情。 在空光驱等情况下,它肯定会有所帮助。 D:\,其中If Exist D:\ 将失败,但这并不一定意味着驱动器号D: 可以分配给新驱动器。

如果您只是想识别第一个安装的驱动器号,按字母顺序

@Set "_l="&For /F Tokens^=* %%A In ('MountVol^|Find ":\"^|Sort/R')Do @Set "_l=%%~dA"
@Echo(The first letter assigned to a drive is %_l%&Pause

要识别最后安装的驱动器号,按字母顺序

@Set "_l="&For /F Tokens^=* %%A In ('MountVol^|Find ":\"^|Sort')Do @Set "_l=%%~dA"
@Echo(The last letter assigned to a drive is %_l%&Pause

要确定第一个可用的,已卸载,驱动器号,按字母顺序

@Set "_l="&For /L %%A In (67 1 90)Do @Cmd/C Exit/B %%A&Call:Sub %%=EXITCODEASCII%%
@Echo(The first available drive letter is %_l%&Pause&Exit/B
:Sub
@If Not Defined _l MountVol|Find "%1:\">Nul||Set "_l=%1:"

并确定最后一个可用的,卸载,驱动器号,按字母顺序

@Set "_l="&For /L %%A In (90 -1 67)Do @Cmd/C Exit/B %%A&Call:Sub %%=EXITCODEASCII%%
@Echo(The last available drive letter is %_l%&Pause&Exit/B
:Sub
@If Not Defined _l MountVol|Find "%1:\">Nul||Set "_l=%1:"

在后两个示例中,如果您希望包含一个可能的B: 驱动器,您可以将67 替换为66,或者如果您还希望包含一个可能的A: 驱动器,则可以替换为65 ,您也可以将其替换为68 以排除C: 驱动器。

【讨论】:

以上是关于使用索引 Batch 在 for 循环中设置变量的主要内容,如果未能解决你的问题,请参考以下文章

批处理 - 在 for 循环中设置变量

在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?

BATCH - 在 for 循环中调用的函数不返回值

嵌套 Batch For Do 循环以使用文件夹名称和文件名

CMD/Batch 从变量中提取每个文本文件行并循环

C ++:for循环中的多个退出条件(多个变量):AND -ed或OR -ed?