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

时间:2019-02-12 10:07:52

标签: batch-file

我正在尝试在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%的值 我在做什么错了?

2 个答案:

答案 0 :(得分:2)

为什么设置了=之前和之后的空格?会创建一个名为%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

答案 1 :(得分:1)

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

对于这种类型的事情,我更喜欢使用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:"

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

@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:"

在后两个示例中,如果希望包括可能的67驱动器,则可以用66替换B:,如果愿意,可以用65替换A:还包括一个可能的68驱动器,您也可以将其替换为C:以排除alexaResponse.session.application.applicationId 驱动器。