for循环中的批处理脚本变量unset无效

时间:2012-07-11 19:55:00

标签: for-loop batch-file local-variables unset

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

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

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

2 个答案:

答案 0 :(得分:2)

http://judago.webs.com/variablecatches.htm对我的问题有解释。魔术线是setlocal enabledelayedexpansion并调用var作为echo!var:〜-9!。 ! vs%......哇! cmd仍然让我感到惊讶。

答案 1 :(得分:0)

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

但如果任何文件名包含!字符,则启用延迟扩展时使用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