2012-07-11 170 views
1

下面是我的脚本。我正在试着查看下面一层的文件夹,只挑出那些文件夹,因此〜-9从路径中提取最后9个字符。但是set var =不会取消设置变量,因为输出会以相同的文件夹名称重复出现#次。另外批量不允许我直接在%% i上执行此提取技巧,因此需要本地变量。未设置for循环的批处理脚本变量无效

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

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

回答

2

http://judago.webs.com/variablecatches.htm对我的问题有一个解释。神奇的线条是setlocal enabledelayedexpansion和调用var作为回声!var:〜-9 !. ! vs%...哇! cmd仍令我惊叹。

+0

+1,好工作找你的问题的根源。如果名称包含'!',你仍然有[潜在问题](http://stackoverflow.com/a/11440780/1012053)。 – dbenham 2012-07-11 20:20:02

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 
相关问题