1

下面是我的脚本。我正在尝试查看下一级的文件夹并仅选择那些文件夹,因此 ~-9 从路径中提取最后 9 个字符。但是 set var= 不会取消设置变量,因为输出返回时会返回相同的文件夹名称,重复 # 次。批处理也不允许我直接在 %%i 上执行此提取技巧,因此需要局部变量。

如何清除此变量以便在下一次迭代中采用新值?

@echo off
 for /d %%i in (%1\*) do (
  set var=%%i
  echo %var:~-9%
   set "var="
)
4

2 回答 2

2

http://judago.webs.com/variablecatches.htm对我的问题有解释。神奇的线条是 setlocal enabledelayedexpansion 并将 var 称为 echo !var:~-9!。!与 % ...哇!cmd 仍然让我感到惊讶。

于 2012-07-11T20:10:35.080 回答
0

您找到了问题的根源,以及解决方案 - 延迟扩展。

!但是,如果任何文件名包含该字符,则在启用延迟扩展时使用 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
于 2012-07-11T20:18:33.913 回答