为了账号安全,请及时绑定邮箱和手机立即绑定

如何在/ F的循环内设置变量

/ 猿问

如何在/ F的循环内设置变量

慕婉清6462132 2019-11-02 11:02:07

我写了这段代码


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%


有任何想法吗?


查看完整描述

3 回答

?
慕神8447489

在for循环和括号范围内,有两种方法可以设置和使用变量。


setlocal enabledelayedexpansion看到setlocal /?求助。这仅适用于XP / 2000或更高版本的Windows。然后使用!variable!而不是%variable%循环内...


使用批处理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

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


查看完整回答
反对 回复 2019-11-02
?
天天世纪

你可能想要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运行的当前值。


查看完整回答
反对 回复 2019-11-02
?
慕雪6442864

我为此奋斗了很多小时。这是我注册命令行变量的循环。示例:Register.bat / param1:value1 / param2:value2


它的作用是循环所有命令行参数,并使用正确的名称将变量设置为值。


之后,您可以只使用set value =!param1 !!设置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    


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 47 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信