在批处理文件中更改For循环中的变量

时间:2011-10-21 15:56:46

标签: search variables batch-file for-loop cmd

所以我试图在批处理文件中使用For循环设置多个变量。我知道我需要使用EnableDelayedExpansion,但我已经测试了几种不同的方法,到目前为止似乎没有任何效果。此外,这通常作为域用户运行,该用户在计算机上没有用户文件夹。

最终目标是为每个用户目录收集notes.ini的文件路径。最初我会为每个文件夹重复一个部分,然后将变量更改为n1,然后是n2,然后是n3。我试图压缩这个并允许此文件处理任意数量的用户文件夹。我需要能够在批处理文件中单独调用每个路径,所以目前我将每个路径写入txt文件,然后将txt文件解析为变量。

这是我的原始代码:

SETLOCAL EnableDelayedExpansion
for /D %%x in ("C:\Users\*") do (
if exist %temp%\niresults.txt del /q %temp%\niresults.txt
dir "%%x\AppData\Local\lotus\Notes\*.*" /L /A /B /S|Find "notes.ini" >> %temp%\niresults.txt
If not exist %temp%\niresults.txt echo "Files not found"
set /p n1= < %temp%\niresults.txt
if exist C:\niresults.txt del /q C:\niresults.txt
)

我计划以下列方式使用变量。

wscript "FnR.vbs" "Find this" "Replace with this" !n1!

wscript "FnR.vbs" "Find this" "Replace with this" %n1% %n2% %n3%... etc

FnR.vbs设置为在循环中接受并处理参数3到x,因此参数的数量无关紧要;然而,FnR确实需要一段时间才能运行。我考虑过将wscript "FnR.vbs"包含在循环中,但是现在我必须为每个文件位置调用它4次,如果必须的话,它会这样做,但它会减慢一切。

那么有没有办法让这个工作,以便每个路径将在一个不同的变量或每次循环运行时更改txt文件的名称?或者省略txt文件并将输出直接转储到变量中(我认为这可能是我最需要它来使用EnableDelayedExpansion)?

最简单的解决方案是,是否可以在循环的第二次迭代中将n1更改为n2,在第3次更改为n3,依此类推。

我知道我可以退出并搜索更大的C:\users目录中的文件,但是我环境中的大多数计算机上的用户数据量会使文件运行所需的时间更长它会取代。

2 个答案:

答案 0 :(得分:1)

您可以采用Aacini在this question的答案中使用的方法。

以下是使用该方法的脚本的样子:

SETLOCAL EnableDelayedExpansion
set i=0
for /D %%x in ("C:\Users\*") do (
if exist %temp%\niresults.txt del /q %temp%\niresults.txt
dir "%%x\AppData\Local\lotus\Notes\*.*" /L /A /B /S|Find "notes.ini" >> %temp%\niresults.txt
If not exist %temp%\niresults.txt echo "Files not found"
set /a i+=1
set /p n!i!= < %temp%\niresults.txt
if exist C:\niresults.txt del /q C:\niresults.txt
)
:: now that you've got an 'array' of n1, n2, n3 etc.
:: you can reference any or all of them as appropriate
wscript "FnR.vbs" "Find this" "Replace with this" "%n1%" "%n2%" "%n3%" ...

答案 1 :(得分:1)

除了使用'索引'变量之外,您还可以使用'list'变量来收集循环中的所有名称,然后稍后在调用VB脚本的命令行中引用它。像这样:

SETLOCAL EnableDelayedExpansion
set nlist=0
for /D %%x in ("C:\Users\*") do (
if exist %temp%\niresults.txt del /q %temp%\niresults.txt
dir "%%x\AppData\Local\lotus\Notes\*.*" /L /A /B /S|Find "notes.ini" >> %temp%\niresults.txt
If not exist %temp%\niresults.txt echo "Files not found"
set /p n1= < %temp%\niresults.txt
set nlist=!nlist! "!n1!"
if exist C:\niresults.txt del /q C:\niresults.txt
)
:: now all the names are in the %nlist% variable,
:: so you can call the VB script like this
wscript "FnR.vbs" "Find this" "Replace with this" %nlist%