我做了这个代码
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%
有任何想法吗?
我做了这个代码
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%
有任何想法吗?
有两种方法来设置和内部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
批处理功能是非常有用的机制。
你可能想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
运行。
我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
试试这个:
setlocal EnableDelayedExpansion
...
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo !z!
echo %%a
)
下面应该工作:
setlocal EnableDelayedExpansion
for /F "tokens=*" %%a in ('type %FileName%') do (
set "z=%%a"
echo %z%
echo %%a
)
我知道这是不是出了什么要求,但我从这种方法中受益,试图将一个“循环”中设置一个变量时。 使用数组。 另一种实现选项。
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
)