none
WSHのDeleteFileにて異常発生 RRS feed

  • 質問

  • 現在、JP1よりVBSを実行して、IFファイル操作などを行うシステムを構築しています。
    ファイルを別フォルダにコピーした上で、削除する仕組みを採用しているのですが、このファイル削除objFSO.DeleteFileにて、エラーが発生しております。

     Do
       objFSO.DeleteFile ... True
       If Err.Number <> 0 then
         booFlag = True
         Exit Do
       Else
         booFlag = False
         Wscript.Sleep(1000)
       End If
     Loop ...
     If booFlag <> 0 then
       Wscript.Quit 1
     End If

    上記にて、一分間、ループでファイル削除を試みて、削除出来たらbooFlagにTrueをセットしてループを抜けます。
    最終的に、booFlagがFalseなら、ファイル削除エラーを返す、という形にしております。

    ここで、ジョブエラーが返るのですが、IFフォルダを見ると、ファイルが消えている、という現象が起きております。
    つまり、ファイルは消せているが、Err.Numberに0が返らない、という現象だと思います。

    本スクリプトの動作環境は、以下の通りです。
    OS:MS Windows 2003サーバSR2(Standard x64 Edit.)
    ジョブ実行:JP1
    IFファイル:テキストファイル
    前後で使用するアプリケーション:SAP PI 7.1(左記アプリケーションにて取り込んだ後のファイルを削除しに行ってエラーが発生する)

    現在、SAP PIがファイルをロックしてしまっている可能性も検証しておりますが、上手く行くケースもあるため、よく分かっておりません。

    WSHの観点から、上記のコーディングにて、同様のエラーに見舞われた方がいらっしゃいましたら、その時の原因など、参考情報をご教示頂ければと思います。

    宜しくお願いします。
    2009年11月30日 1:31

すべての返信

  • 「削除出来たらbooFlagにTrueをセットしてループを抜けます。」なら
    3行目の「If Err.Number <> 0 then」は
    「If Err.Number = 0 then」なのでは?
    2009年11月30日 4:56
  • すみません、、仰るとおり、「「If Err.Number = 0 then」です。
    私の転記ミスです。

    実装は、「=」を使用しております。
    2009年11月30日 6:58
  • その後の調査結果を報告します。
    -----
    調査方法:
    ファイル削除時のErr.Number<>0の時に(上記ソースのElseの直後に)、
    「objLogFile.WriteLine("NG" & (cnt + 1) & "回目:" & Err.Description)」でログを取る
    調査結果:
    NG1回目:書き込みできません。
    NG2回目:書き込みできません。
    NG3回目:書き込みできません。
    NG4回目:ファイルが見つかりません。
    NG5回目:ファイルが見つかりません。
    NG6回目:ファイルが見つかりません。
    ・・・
    -----
    このように、3回目までは書き込みエラー(直前のアプリがファイルを排他ロックしている?)で、その後はファイルが無い、というエラー内容でした。
    各回の間には1秒のスリープを埋め込んでいるので、開始3秒程はファイルロックエラーであり、その後は、、「ファイルが消せているのにエラーが返る」という形です。
    これが、以下どちらなのか、、不明です。
    1. NG3回目の処理で、Err.Numberには0以外が返るのにファイルは消せている
    2. NG4回目の処理で、Err.Numberには0以外が返るのにファイルは消せている

    お聞きしたいのですが、以下、如何でしょうか。
    1のケース:Delete文がキューに入り、ロック解除後にファイル削除出来るが、Err.Numberにはその前にエラーが返る、ということがありえるのか
    2のケース:Delete文が正常に終了しているのに、Err.Numberにエラーが返ることはありえるのか

    2は論外だろうという感触です。
    (これをやられちゃうと、WSHが全く信用出来ません)
    一方、1も相当に厳しい妄想ですが、ありえない話ではないのかなぁ、という感じです。

    皆様、如何でしょうか・・
    2009年11月30日 7:32
  • スクリプトを作って試してみたところ同じ動作になりました
    (IF文のTRUE側を通らないでELSE側だけ繰り返し通るのにファイルは消えます。)

    ↓のようなことを書かれているかたもいるくらいなのでそういうものなのかもしれませんが、
     DeleteFile の詳しい仕様についてはわかりませんでした。

    ファイル削除/リネームのタイミングエラーを回避するVBScript代替関数
    http://www.vector.co.jp/soft/winnt/prog/se366912.html
    <抜粋>
    Windows2000/XPでは、困ったことに、
    「一般に、ファイルの削除やリネームはタイミングにより失敗することがある。」
    というのが「仕様」なのです。
    </抜粋>

    > 1のケース:Delete文がキューに入り、ロック解除後にファイル削除出来るが、Err.Numberにはその前にエラーが返る、ということがありえるのか
    > 2のケース:Delete文が正常に終了しているのに、Err.Numberにエラーが返ることはありえるのか

    ↑の問いかけですが、DeleteFile の仕様がわからないうちは
    “どちらもありえる”と考えて実装するしかないと思います。

    2009年11月30日 9:30
  • 衝撃の仕様ですね。。。

    ということは、DeleteFileをループで回して、そのErr.Numberでファイル削除可否を判断するのではなく、
    その後にFileExistsで確認して削除出来てるかを判断、とすべきなのでしょうか。
    あまり上等ではないアーキになりそうで好きではないですが。。

    因みに、.batで作った場合、このような「仕様」は存在しない、と考えて良いのでしょうか。
    経験上、変なことは起きたことが無いのですが・・
    ご存知であれば、教えて頂きたいと思います。

    以上、宜しくお願い致します。
    2009年11月30日 10:46
  • bat で del コマンドを使うということですね
    動作的におかしいと感じたことは無いですが
    del コマンドの戻り値はあてにならなかったように思います。
    ↓参考サイト
    コマンドプロンプトでファイル削除時の戻り値を取得したい
    http://okwave.jp/qa625147.html

    とまあこれくらいのことしかわからないのですが、、、
    話は変わりますが、このフォーラム(MSDN / TechNet フォーラムへのご意見ご要望)
    はちょっとフォーラム違いなきがします。
    どこが適切なフォーラムなのかはわからないのですが、たとえば
    「Windows クライアント開発 - 全般」
    http://social.msdn.microsoft.com/Forums/ja-JP/windowsgeneraldevelopmentissuesja/threads
    があります。ご参考まで。

    追記:↑適切なフォーラムへ投稿したほうが、たくさんの方から回答してもらえるかもしれないという意図で書きました。
    • 編集済み anningo 2009年11月30日 11:32 追記
    2009年11月30日 11:28
  • 皆様、こんにちは。

    エラーの判定後、再びErrオブジェクトを使用する場合は Err.Clear を呼び出してください。
    Errオブジェクトは最後に発生したエラーを保持し続けますので、今回のコードだと一回目で DeleteFile が成功しない限りループしてしまいます。
    Clear メソッド (Err オブジェクト)
    http://msdn.microsoft.com/ja-jp/library/hh2zczch.aspx

    VBScriptにおけるエラー処理(外部サイト)
    http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh09/cformwsh09_02.html

    また、スクリプトについて扱うカテゴリは現在MSDNに無いのですが、あんにんごさんのアドバイスのように
    できるだけ質問内容に近いと思われるカテゴリに投稿いただければと思います。

    それでは。
    2009年12月1日 3:11
  • とんだミスリードをしてしまいましたm(_ _)m
    もう一回スレッドを見てほしいという願いを込めて返信いたします。
    2009年12月1日 4:27
  • だいぶ時間が経過してますが、

    ファイル削除/リネームのタイミングエラーを回避するVBScript代替関数
    http://www.vector.co.jp/soft/winnt/prog/se366912.html

    では、

    Err.Clear

    でなく、

    On Error Resume Next

    を使用してます。

    Err オブジェクト

    Err オブジェクトの各プロパティは、On Error Resume Next ステートメントの後、0 または長さ 0 の文字列 ("") にリセットされます。Clear メソッドを使うと、Err を明示的にリセットすることができます。

    2013年7月22日 5:27