Изменить переменную в цикле For в пакетном файле - PullRequest
1 голос
/ 21 октября 2011

Поэтому я пытаюсь установить несколько переменных с помощью цикла For Latch в пакетном файле.Я знаю, что мне нужно использовать EnableDelayedExpansion, но я опробовал несколько различных методов, и пока что ничего не работает.Кроме того, он обычно запускается как пользователь домена, у которого нет папки пользователя на компьютере.

Конечная цель - собрать путь к файлу для notes.ini для каждого пользовательского каталога.Первоначально я повторил бы раздел для каждой папки и изменил бы переменную на n1 тогда n2 тогда n3.Я пытаюсь сжать это и позволить этому файлу обрабатывать любое количество пользовательских папок.Мне нужно иметь возможность вызывать каждый путь отдельно в пакете, поэтому в настоящее время каждый путь записывается в текстовый файл, а затем текстовый файл анализируется в переменной.

Это мой оригинальный код:

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 на второй итерации цикла и n3 на 3-й и т. д.

Я знаю, что могу вернуться и найти файлы в более крупном каталоге C:\users, но с количеством пользовательских данных на большинстве машин в моей среде, что может занять больше времени, чтобы файл работалдействия, которые он заменит.

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Кроме использования «индексированных» переменных, вы можете использовать переменную «список» для сбора всех имен в цикле, а затем просто ссылаться на них позже в командной строке, которая вызывает скрипт VB.Как то так:

SETLOCAL EnableDelayedExpansion
<b>set nlist=0</b>
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
<b>set nlist=!nlist! "!n1!"</b>
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%
1 голос
/ 27 октября 2011

Вы можете использовать подход, использованный Аасини в ответе на этот вопрос .

Вот как ваш сценарий может выглядеть при таком подходе:

SETLOCAL EnableDelayedExpansion
<b>set i=0</b>
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"
<b>set /a i+=1</b>
set /p n<b>!i!</b>= < %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%" ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...