0

ファイルスタンプとスクリプト実行タイムスタンプを比較するコードがあります。値が異なる場合は機能しますが、値が同じ場合、コードはまだループから抜けません。この背後にある理由は、スクリプトの先頭にある 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

)
**ログ**
**日付スタンプ 201310071449
ファイルスタンプ 201310071435**
ファイルはスクリプトの実行時間より古いです。
24 遅延
カウンター値は 1
ディレクトリにファイルが存在するかどうかの確認
2013/10/07 02:49 午後
ファイル分 49
02
ファイルAMPM PM
2
ファイル時間の長さ 1
fileTimemod 2
結果 14
最終 1449
**日付スタンプ 201310071449
ファイルスタンプ 201310071449**
ファイルはスクリプトの実行時間より古いです。
24 遅延

提案は大歓迎です。

前もって感謝します!

4

1 に答える 1

0

setlocal EnableDelayedExpansion問題ではなく解決策です。

ブロックが実行される前にパーセント展開が展開され、行が実行されるときに展開が遅延されるため、ブロック内の変数には常に遅延構文を使用する必要があります。

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

2 つの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
)
于 2013-10-07T20:52:29.727 に答える