批处理脚本变量无法正常工作

时间:2011-09-08 19:44:21

标签: windows batch-file

嗯......我试着尽可能少地批处理,我主要是一个C / C#/ C ++人。我的问题是我的脚本执行了两个嵌套的FOR循环,我首先遍历'Users'文件夹并抓住用户名,然后通过其他文件夹:

 set BaseDir=%CD%
 cd C:\Users
 for /F %%I in ('DIR *.* /B /O:-D') do (
     set UserName=%%I
     echo %UserName%
 )
 cd %BaseDir%

这大致证明了这个问题。也许这是我的C ++风格格式?也许在批处理时我很蠢?假设我的系统上有3个用户(Admin,User1,User2;按此顺序),这将打印:

 Admin
 Admin
 Admin

托特错了。如果有人在%%上调用echo,那么一切都会按计划进行:

 Admin
 User1
 User2

就变量而言,我在这里遗漏了什么,或者交易是什么? DOS不喜欢变量重新赋值? Thnx提前。 (规格:Windows 7,记事本,cmd作为管理员)

2 个答案:

答案 0 :(得分:2)

由于您要更改FOR循环中的变量,因此需要启用延迟扩展:

SETLOCAL ENABLEDELAYEDEXPANSION
cd C:\Users
for /F %%I in ('DIR *.* /B /O:-D') do (
 set UserName=%%I
 echo %UserName%
)

EDIT 一种巧妙的方法来分别分配变量以访问循环外的每个实例

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
    cd C:\Users
    for /F %%I in ('DIR *.* /B /O:-D') do (
     set UserName!count!=%%I
     echo %UserName!count!%
     set count=!count!+1
    )

答案 1 :(得分:2)

另一种选择是使用子程序:

 pushd C:\Users
 for /F %%I in ('DIR *.* /B /O:-D') do call :perfile %%I
 popd
 goto :eof

 :perfile
 set UserName=%*
 echo %UserName%
 goto :eof

另请注意使用pushd和popd以避免需要将原始目录存储在环境变量中。