使用索引 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 循环中设置变量的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?