【问题标题】:batch script variable unset in for loop has no effectfor循环中未设置的批处理脚本变量无效
【发布时间】:2012-07-11 12:41:54
【问题描述】:
以下是我的脚本。我正在尝试查看下一层的文件夹并仅选择那些文件夹,因此 ~-9 从路径中提取最后 9 个字符。但是 set var= 不会取消设置变量,因为输出返回时会返回相同的文件夹名称,重复 # 次。批处理也不允许我直接在 %%i 上执行此提取技巧,因此需要局部变量。
如何清除此变量,以便在下一次迭代中采用新值?
@echo off
for /d %%i in (%1\*) do (
set var=%%i
echo %var:~-9%
set "var="
)
【问题讨论】:
标签:
for-loop
batch-file
local-variables
unset
【解决方案2】:
您找到了问题的根源,以及解决方案 - 延迟扩展。
但如果任何文件名包含! 字符,则在启用延迟扩展时使用 FOR 可能会导致问题。如果值包含 ! 并且启用了延迟扩展,则 for 变量 %%i 的扩展将被破坏。这不是一个常见的问题,但它会发生。
解决方案是在循环中打开和关闭延迟扩展
@echo off
setlocal disableDelayedExpansion
for /d %%i in (%1\*) do (
set var=%%i
setlocal enableDelayedExpansion
echo !var:~-9!
endlocal
)
我也想知道您所说的 “我正在尝试查看下一级文件夹并仅选择那些文件夹,因此 ~-9 从路径中提取最后 9 个字符”时间>。我怀疑您正在尝试获取子文件夹的名称,而没有前导路径信息。如果是这样,那么使用子字符串操作不是一个好的解决方案,因为文件夹名称的长度会有所不同。
有一个非常简单的方法可以获取不带前导路径信息的文件夹名称:
for /d %%i in (%1\*) do echo %%~nxi