0

特定のファイルの最終変更日を見つけるバッチスクリプトを実行しようとしています。次のスクリプトに似たものを使用しています。

@echo off

set mainDir=\\subdomain.myintranet.net\c$
set txtFile=%mainDir%\tmp.txt
set txtFile2=%mainDir%\tmp2.txt
set "bodyText=^<p^>Hello,^<br /^>^<br /^>"

if exist %txtFile% (
    for %%X in (%txtFile%) do (set fileDate=%%~tX)
    set "bodyText=%bodyText%tmp.txt file updated as of %fileDate%^<br /^>"
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile%.^<br /^>"
)

if exist %txtFile2% (
    for %%X in (%txtFile2%) do (set fileDate2=%%~tX)
    set "bodyText=%bodyText%tmp2.txt file updated as of %fileDate2%^<br /^>"
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile2%.^<br /^>"
)

set "bodyText=%bodyText%^</p^>"

echo %bodyText% > %mainDir%\mylog.txt

このサンプルコードをテストしてみると、うまくいくこともあれば、うまくいかないこともあります。何が起こるかというと、ファイルは見つかりましたが、fileDate変数は空白に戻っています。

スクリプトの先頭に空の変数を入れてみfileDate=ましたが、うまくいきませんでした。

重要な場合:毎日実行されるSQLServer2000ジョブにバッチスクリプトを接続しています。バッチファイルとログファイルはデータベースと同じサーバー上にありますが、バッチスクリプトは、例で示したようにファイルの場所を完全に修飾します(これは、デスクトップからバッチファイルを実行する場合、チェックするためです。 /正しいファイルを更新します)。

よろしくお願いします、ジョセフ

編集:

出力は次のようになります。

Hello,

tmp.txt file updated as of 9/19/2012 2:24 PM 
tmp2.txt file updated as of 9/19/2012 10:02 AM

私が時々得るのは:

Hello,

tmp.txt file updated as of 
tmp2.txt file updated as of 

そして他の時に私は得るかもしれません:

Hello,

tmp.txt file updated as of 9/19/2012 2:24 PM 
tmp2.txt file updated as of 

何が悪いのかを理解するのは混乱します。

4

1 に答える 1

3

うめき声...

これは、Windowsバッチ開発で最も一般的なバグである必要があります。同じコードブロック内に設定された変数を展開しようとしています。ただし、コードブロック全体が解析されると変数が展開されるため、コードブロックが実行される前に存在していた値を取得します。それは明らかに機能しません。

HELP SETまたはコマンドプロンプトSET /?から入力し、遅延拡張に関するセクションをお読みください。これは、問題を解決する1つの方法を示しています。

ただし、あなたの場合、変数はまったく必要ないので、拡張を遅らせる必要はありません。bodyTextに追加するときは、FOR変数を直接使用するだけです。

@echo off

set mainDir=\\subdomain.myintranet.net\c$
set txtFile=%mainDir%\tmp.txt
set txtFile2=%mainDir%\tmp2.txt
set "bodyText=^<p^>Hello,^<br /^>^<br /^>"

if exist %txtFile% (
    for %%X in (%txtFile%) do set "bodyText=%bodyText%tmp.txt file updated as of %%~tX^<br /^>"
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile%.^<br /^>"
)

if exist %txtFile2% (
    for %%X in (%txtFile2%) do set "bodyText=%bodyText%tmp2.txt file updated as of %%~tX^<br /^>"
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile2%.^<br /^>"
)

set "bodyText=%bodyText%^</p^>"

echo %bodyText% > %mainDir%\mylog.txt


編集

コードの保守を容易にするために、簡略化の余地がたくさんあります。HTMLファイルを準備しているので、追加の改行を心配する必要はありません。したがって、すべてのテキストを1つの変数に入れる必要はありません。複数のECHOステートメントを使用できます。私はあなたのコードを次のように構成します(テストされていませんが、概念は健全です):

@echo off
setlocal
set "mainDir=\\subdomain.myintranet.net\c$"
set "br=^<br /^>"
set "p=^<p^>"
set "/p=^</p^>"
>"%mainDir%\mylog.txt" (
  echo %p%Hello,%br%%br%"
  for %%F in (
    "%mainDir%\tmp.txt"
    "%mainDir%\tmp2.txt"
  ) do (
    if exist %%F (
      echo %%~nxF file updated as of %%~tF%br%"
    ) else (
      echo Warning: Issues finding %%~nxF.%br%"
    )
  echo %/p%
)
于 2012-09-20T19:38:31.410 に答える