如何将批处理脚本中的当前变量值与之前的变量值进行比较?

如何将批处理脚本中的当前变量值与之前的变量值进行比较?

基于此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\--

相关内容