【问题标题】:Setting a variable within a for loop using the index Batch [duplicate]使用索引 Batch 在 for 循环中设置变量
【发布时间】: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% 的值 我做错了什么?

【问题讨论】:

    标签: batch-file


    【解决方案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: 驱动器。

      【讨论】:

        猜你喜欢
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        • 2014-05-05
        • 1970-01-01
        相关资源
        最近更新 更多