如何设置一个变量/ F一环内(How to set a variable inside a loop

2019-06-21 21:41发布

我做了这个代码

dir /B /S %RepToRead% > %FileName%

for /F "tokens=*" %%a in ('type %FileName%') do (
    set z=%%a
    echo %z%
    echo %%a
)

echo %%a是工作正常,但echo %z%的回报“回声禁用”。

我需要设置%Z%,因为我想分裂像变量%z:~7%

有任何想法吗?

Answer 1:

有两种方法来设置和内部for循环和括号范围使用变量。

  1. setlocal enabledelayedexpansionsetlocal /? 求助。 在XP / 2000或Windows的新版本里,才能工作。 然后使用!variable! 代替%variable%的循环中...

  2. 使用批处理goto标志创建一个批处理功能: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 

    批处理功能是非常有用的机制。



Answer 2:

你可能想SETLOCAL ENABLEDELAYEDEXPANSION 。 见https://devblogs.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运行。



Answer 3:

我struggeld对这么多小时。 这是我的循环登记命令行瓦尔。 例如:的Register.bat /参数1:数值1 /参数2:VALUE2

是什么呢,是循环中的所有命令行参数,可以和设置该变量用真名的值。

在此之后,你可以使用设定值=!参数1! 集值2 =!param2的!

不管序列PARAMS中给出。 (所谓的命名参数)。 注意!<>!而不是%<>%。

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    


Answer 4:

试试这个:

setlocal EnableDelayedExpansion

...

for /F "tokens=*" %%a in ('type %FileName%') do (
    set z=%%a
    echo !z!
    echo %%a
)


Answer 5:

下面应该工作:

setlocal EnableDelayedExpansion
for /F "tokens=*" %%a in ('type %FileName%') do (
    set "z=%%a"
    echo %z%
    echo %%a
)


Answer 6:

我知道这是不是出了什么要求,但我从这种方法中受益,试图将一个“循环”中设置一个变量时。 使用数组。 另一种实现选项。

SETLOCAL ENABLEDELAYEDEXPANSION

...

set Services[0]=SERVICE1
set Services[1]=SERVICE2
set Services[2]=SERVICE3

set "i=0"

:ServicesLoop
if defined Services[%i%] (
    set SERVICE=!Services[%i%]!

    echo CurrentService: !SERVICE!

    set /a "i+=1"
    GOTO :ServicesLoop
)


文章来源: How to set a variable inside a loop for /F