嗯......我试着尽可能少地批处理,我主要是一个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作为管理员)
答案 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以避免需要将原始目录存储在环境变量中。