0

私の要件はfile_%y%-%m%-%d%-05-00.txt、特定のパスにファイルが存在するかどうかを確認すること\\servername\e$\folder\です。

バッチファイルは1つのサーバーAに配置され、サーバーAとサーバーBにinfile_%y%-%m%-%d%-05-00.txtが存在するかどうかを確認する必要があります。\\servername\e$\folder\

変数にパスを指定しようとしましたが、機能しません。パスを直接指定しようとしましたが、それも機能しません。私のログファイルにはエントリが含まれています

Server: servername               
File file_2013-03-25-05-00.SEC HAS been found 
File file_2013-03-25-05-00.SEC HAS NOT been found

私が書いたスクリプトは次のとおりです。

set d=%date:~7,2%
set m=%date:~4,2%
set y=%date:~10,4%

ECHO Server: servername >> log.txt

ECHO .....................................

IF EXIST \\servername\e$\folder\file_%y%-%m%-%d%-05-00.txt (
GOTO file_found
) ELSE (
GOTO file_not_found)

:file_found
ECHO File file_%y%-%m%-%d%-05-00.txt HAS been found >> log.txt


:file_not_found
ECHO File file_%y%-%m%-%d%-05-00.txt >> log.txt

上記のスクリプトでエラーとは何か、どのような変更が必要かを調べるのを手伝ってください。

4

1 に答える 1

1

:file_foundDelphiのような言語とは異なり、batchは、またはのようなラベルを無視して、ステートメントを行ごとに実行するだけ:file_not_foundです。ラベルが使用されるのは、でのみですGOTO。ここで、実行は指定された宛先ラベルにジャンプします(のようにGOTO file_not_found

したがって、を実行するGOTO file_foundと、が実行され、ラベルECHO file...foundの後の次のステートメントに進みます。:file_not_found

修正するには、

goto :eof

後の行にECHO...has been found

特別なラベル:eof(大文字と小文字を区別しない)は、「バッチファイルの終わり」を意味するようにバッチで事前定義されていることに注意してください。この事前定義を使用するには、ではなくコロンを使用する必要があります。:EOFeof


それを見つけた!!

問題が明白に見えたので(フロースルー、両方のメッセージの生成)、メッセージがコードテキストと異なるために編集されていたため、投稿されたコードをコピーして貼り付ける必要はありませんでした。

フロースルーの問題は修正されましたが、さらに問題が発生しました。実際には存在しないにもかかわらず、ファイルが検出されました...

コメントから元の質問に実際のコードをパッチしました(今でもまだレビューを待っています...)。

そして、はい-非常に正しい-ファイルが存在しないにもかかわらず、ファイル検出されました...[劇的な音楽を挿入]

そして、使用されているコードを正確に投稿する理由はここにあります(最小限の検閲のつぶやきで)

開始のSET行には、TRAILINGSPACESがあるように見えます。その結果、変数ymおよびd末尾にスペースがあり、実行されている有効なステートメントは次のようになりました。

IF EXIST \\.....file_2013 03 25 -05-00.SEC (GOTO ...

これで、パーサーがこれをスローしなかった理由がわかりませんが、それは脇に置いておきます。

治療法:(日付形式とネットワークリソースに合わせて変更を加える必要があったため、コードを投稿しません)

@echo off 
set "d=%date:~0,2%"
set "m=%date:~3,2%"
set "y=%date:~6,4%"

これらの行の末尾のスペースは無視されるため、これは機能するはずです。

NOTEPADは、このような問題を引き起こすことで有名です。EDITPLUSを使用して

于 2013-03-25T06:39:41.900 に答える