Подтвердить что ты не робот

Как установить переменную внутри цикла для/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%

Любые идеи?

4b9b3361

Ответ 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
)