基于此ss64.com,应该可以通过启用延迟扩展来做到这一点,但我无法让它工作。
我想在 for 循环中将变量中的当前值与之前的值进行比较。这是我目前所做的。
@Echo off
Setlocal EnableDelayedExpansion
Set "_var=first"
Set "_var=second" && Echo %_var% !_var!
For /R %%D in ( *_scan.log ) do ( Set "path_only=%%~dpD" && Echo --%path_only%~~~!path_only!-- )
返回结果:
first second
--~~~W:\SCAN_LOGS\111\AAA11\--
--~~~W:\SCAN_LOGS\111\BBB22\--
--~~~W:\SCAN_LOGS\111\CCC33\--
期望结果:
first second
--~~~W:\SCAN_LOGS\111\AAA11\--
--W:\SCAN_LOGS\111\AAA11\~~~W:\SCAN_LOGS\111\BBB22\--
--W:\SCAN_LOGS\111\BBB22\~~~W:\SCAN_LOGS\111\CCC33\--
我如何才能获得期望的结果?那么我可以将当前值与之前的值进行比较吗?
答案1
这是工作
您看到的行为正如您提供的文章链接中所述:s64: 启用延迟扩展。
延迟扩展将导致批处理文件中的变量在执行时而不是在解析时扩展,此选项通过 SETLOCAL EnableDelayedExpansion 命令打开。
当延迟扩展生效时,可以使用 !variable_name! 立即读取变量
您提供的代码完美地证明了这一点:
- 解析时:
%_var% == "first"
- 执行时:
!_var! == "second"
- 解析时:
%path_only% == NULL
- 执行时:
!path_only! == "W:\SCAN_LOGS\111\AAA11\"
循环 2:!path_only! == "W:\SCAN_LOGS\111\AAA11\"
循环 3:!path_only! == "W:\SCAN_LOGS\111\AAA11\"
为什么%path_only% == NULL
?
在解析文件时,
%%D == NULL
因此 %%~dpD == NULL
%path_only% == NULL
要将前一个循环与当前循环进行比较,您需要存储前一个循环的值并检索它。您可以使用一个简单的变量来做到这一点。
我oldpath
在下面的例子中使用
@Echo off
Setlocal EnableDelayedExpansion
Set "_var=first"
Set "_var=second" && Echo %_var% !_var!
Set "oldpath=first_loop"
For /R %%D in ( *_scan.log ) do (
Set "path_only=%%~dpD"
Echo --!oldpath!~~~!path_only!
Set "oldpath=!path_only!"
)
结果:
first second
--first_loop~~~W:\SCAN_LOGS\111\AAA11\--
--W:\SCAN_LOGS\111\AAA11\~~~W:\SCAN_LOGS\111\BBB22\--
--W:\SCAN_LOGS\111\BBB22\~~~W:\SCAN_LOGS\111\CCC33\--