Как установить переменную внутри цикла для/F
Я сделал этот код
dir /B /S %RepToRead% > %FileName%
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo %z%
echo %%a
)
echo %%a
работает нормально, но echo %z%
возвращает "echo disabled".
Мне нужно установить% z%, потому что я хочу разбить переменную как %z:~7%
Любые идеи?
Ответы
Ответ 1
Существует два метода установки и использования переменных внутри цикла и круглых скобок.
-
setlocal enabledelayedexpansion
см. setlocal /?
для справки. Это работает только в XP/2000 или более поздних версиях Windows.
то используйте! переменную! вместо% variable% внутри цикла...
-
Создайте пакетную функцию с использованием меток-меток пакетов :Label
.
Пример:
for /F "tokens=*" %%a in ('type %FileName%') do call :Foo %%a
goto End
:Foo
set z=%1
echo %z%
echo %1
goto :eof
:End
Пакетные функции - очень полезный механизм.
Ответ 2
Вероятно, вы хотите SETLOCAL ENABLEDELAYEDEXPANSION
. Подробнее см. https://blogs.msdn.microsoft.com/oldnewthing/20060823-00/?p=29993/.
В основном: Обычный %variables%
расширяется сразу после cmd.exe
, читает команду. В вашем случае "команда" - это целое
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo %z%
echo %%a
)
петли. В этот момент z
еще не имеет значения, поэтому echo %z%
превращается в echo
. Затем выполняется цикл и устанавливается z
, но его значение больше не используется.
SETLOCAL ENABLEDELAYEDEXPANSION
разрешает дополнительный синтаксис !variable!
. Это также расширяет переменные, но делает это только перед каждой (суб) командой.
SETLOCAL ENABLEDELAYEDEXPANSION
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo !z!
echo %%a
)
Это дает вам текущее значение z
при каждом запуске echo
.
Ответ 3
Я боролся много часов с этого.
Это мой цикл, чтобы регистрировать ключи командной строки.
Пример: Register.bat/param1: value1/param2: value2
Что это такое, цикл - это все параметры командной строки,
и установите для переменной значение с соответствующим именем.
После этого вы можете просто использовать
set value =! param1!
set value2 =! param2!
независимо от последовательности параметров. (так называемые именованные параметры).
Обратите внимание на! < > !, вместо% < > %.
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%P IN (%*) DO (
call :processParam %%P
)
goto:End
:processParam [%1 - param]
@echo "processparam : %1"
FOR /F "tokens=1,2 delims=:" %%G IN ("%1") DO (
@echo a,b %%G %%H
set nameWithSlash=%%G
set name=!nameWithSlash:~1!
@echo n=!name!
set value=%%H
set !name!=!value!
)
goto :eof
:End
Ответ 4
Попробуйте следующее:
setlocal EnableDelayedExpansion
...
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo !z!
echo %%a
)
Ответ 5
Следующее должно работать:
setlocal EnableDelayedExpansion
for /F "tokens=*" %%a in ('type %FileName%') do (
set "z=%%a"
echo %z%
echo %%a
)