【问题标题】:taking the new value of variable when setlocal EnableDelayedExpansion is set设置 setlocal EnableDelayedExpansion 时取变量的新值
【发布时间】:2013-10-07 20:01:03
【问题描述】:

我有一个比较文件戳和脚本执行时间戳的代码。 如果值不同,它会起作用,但是当值相同时,代码仍然不会跳出循环。 我认为这背后的原因是脚本开头的语句 setlocal enableDelayedExpansion。

代码正确打印了filestamp和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

)
**日志** **日期戳 201310071449 文件戳 201310071435** 该文件早于脚本执行时间。 24 延迟 计数器值为 1 检查文件是否存在于目录中 2013 年 10 月 7 日下午 02:49 文件分钟 49 02 文件AMPM PM 2 文件时间长度 1 文件时间模块 2 结果 14 最终1449 **日期戳 201310071449 文件戳 201310071449** 该文件早于脚本执行时间。 24 延迟

欢迎提出建议。

提前致谢!

【问题讨论】:

  • 您应该将您的脚本缩减为绝对必要的代码来演示问题

标签: batch-file


【解决方案1】:

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
)

【讨论】:

  • 我尝试将 % 更改为 !但它仍然不起作用。时间戳是相同的,但如果条件不起作用。试用整个批处理脚本。
  • 感谢您的指点。只是通过在 echo 语句中添加 " 我发现文件戳在末尾有一个空格。datestamp "201310071637" filestamp "201310071634" 我现在必须弄清楚该空间是如何添加的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多