设置setlocal EnableDelayedExpansion时获取变量的新值

时间:2013-10-07 20:01:03

标签: batch-file

我有一个代码,用于将filestamp与脚本执行时间戳进行比较。 如果值不同,它可以工作,但是当值相同时,代码仍然不会退出循环。 我在想这背后的原因是脚本开头的声明setlocal enableDelayedExpansion。

代码正确打印filesstamp和datestamp的值,但if逻辑无法正常工作。

@ECHO off
setlocal EnableDelayedExpansion

ECHO !fileTimemod!>x&FOR %%? IN (x) DO SET /A strlength=%%~z? - 2&del x
echo filetimelength !strlength!
IF !strlength! EQU 1 (
    SET fileTimemod=0!fileTimemod!
echo fileTimemod !fileTimemod!
)



set FileM=!filestamp:~0,2!
set FileD=!filestamp:~3,2!
set FileY=!filestamp:~6,4!


set filestamp=!FileY!!FileM!!FileD!!final!

echo datestamp !datestamp!
echo filestamp !filestamp!
set newTimestamp=!filestamp!

 if  "!datestamp!" gtr "!filestamp!" (
 echo The file is older than the script execution time.

 ) else (
 echo Read the new file

)
**Log**
**datestamp 201310071449
filestamp 201310071435**
The file is older than the script execution time.
24 delay
counter value is 1
Checking whether the file  exists in the directory
10/07/2013 02:49 PM
File minutes 49
02
fileAMPM PM
2
filetimelength 1
fileTimemod 2
result 14
final 1449
**datestamp 201310071449
filestamp 201310071449**
The file is older than the script execution time.
24 delay

欢迎提出建议。

提前致谢!

1 个答案:

答案 0 :(得分:0)

setlocal EnableDelayedExpansion解决方案不是问题。

您应该始终对块内的变量使用延迟语法,因为百分比扩展将在执行块之前扩展,在执行一行时延迟扩展。

IF %strlength% EQU 1 (
  SET dateHMod=0%dateHMod%
  echo dateHMod %dateHMod%
)
echo dateHMod %dateHMod%

两条echo行显示不同的输出,第一条没有0下一条0

IF !strlength! EQU 1 (
  SET dateHMod=0!dateHMod!
  echo dateHMod !dateHMod!
)
echo dateHMod !dateHMod!

这总是按预期工作。

在您的情况下,问题也可能是隐藏的空间问题 您的脚本与您的值一样按预期工作 set命令后的隐藏空间不可见,但会附加到变量中,因此在使用set时使用引用语法总是一个好主意,这只会将所有字符分配到最后一句话。

setlocal EnableDelayedExpansion
set "datetime=201310071449" This won't be assigned
set "filestamp=201310071449"
echo datestamp -!datestamp!-
echo filestamp -!filestamp!-
set "newTimestamp=!filestamp!"

if  "!datestamp!" gtr "!newTimestamp!" (
    echo The file is older than the script execution time.
) else (
    echo Read the new file
)