2011-03-22 7 views
1

私は各オフィス(office_list.txt)にあるユーザーリスト(office_id_list_%YY_MM_DD%\%%)を順番に調べて、新しいファイル日付(%3)が見つかりました。以下のコードは動作しませんでしたので、errorlevelをエコーすることにし、常に-1073741510(Windows 2003マシンで作業していたこと)であることが判明しました。最終的には、特定の日付以降に変更されていないユーザーのホームディレクトリ(オフィスで編成されたもの)を特定しようとしています。 どんな考えも大歓迎です。に埋め込まれたforfilesコマンドの戻りコードがわからない


for /f "tokens=1 delims= " %%i in (U:\sysmon\u_cleanup\office_list.txt) do (
    if not exist u:\sysmon\u_cleanup\results\%%i mkdir u:\sysmon\u_cleanup\results\%%i 
    for /f "tokens=1 delims= " %%j in (U:\sysmon\u_cleanup\results\office_lists_%YY_MM_DD%\%%i_dir_list_%YY_MM_DD%_final.txt) do (
    forfiles /P %1%%i\%%j /S /D +%3 /C "cmd /c if %errorlevel% == 0 echo ** Do not Archive - Found files modified after %3 > U:\sysmon\u_cleanup\results\%%i\%%j_%YY_MM_DD%.txt" 
) 
) 

答えて

0

おそらく、主な問題は、あなたのコマンドのいずれかが実行される前に、それはエラーレベルを拡張し、一部cmd /c if %errorlevel% == 0です。

通常は遅延拡張が選択されますが、新しいcmdコンテキストにあるため、ここでは機能しません(Joeyは/ V:onを参照)。ここで

完全なブロックが最初に解析されるので、もしあなたが、それをこのようcmd /c if %%errorlevel%% == 0を使用することができますが、一部はcmd /c if %errorlevel% == 0に展開され、cmd /cが実行されたとき、これは、第二の時間を拡大しています。

そして、あなたは、コードビット

set "officePath=U:\sysmon\u_cleanup" 
set "officeDatePath=%officePath%\results\office_lists_%YY_MM_DD%" 
for /f "tokens=1 delims= " %%i in ("%officePath%\office_list.txt") do (
    if not exist "%officePath%\results\%%i" (
     mkdir "%officePath%\results\%%i" 
    ) 
    for /f "tokens=1 delims= " %%j in ("%officeDatePath%\%%i_dir_list_%YY_MM_DD%_final.txt") do (
     forfiles /P %1%%i\%%j /S /D +%3 /C "cmd /c if %%errorlevel%% == 0 echo ** Do not Archive - Found files modified after %3 > %officePath%\results\%%i\%%j_%YY_MM_DD%.txt" 
    ) 
) 
+0

ありがとうございました。また働いた。コード美化のヒントありがとう。私はできるだけ合理化したいのですが、試してみるともっと多くの問題を紹介しているようです。遅れた展開やどのようにdosが変数を解釈するか(おそらく読み込み時間と実行時の議論)など、良い参考資料がありますか?いずれにせよ、ありがとう。 – jim

+0

@jim:バッチがどのように動作するかを理解するための、初心者でも専門家でもある[Dostips.com](http://www.dostips.com) ://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/4095133#4095133) – jeb

1

cmd/V:onオプションを追加し、遅延拡張をオンに!errorlevel!の代わり%errorlevel%を使用美化できます。

+0

ありがとうございました。素晴らしい仕事をした。 – jim

関連する問題