2011-03-22 61 views
1

我試圖循環遍歷每個辦公室(office_list.txt)的用戶列表(office_id_list_%YY_MM_DD%\%%),並在文件更新時創建文件找到日期(%3)。下面的代碼沒有工作,所以我決定回顯錯誤級別,發現它始終是-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,你的任何命令被執行之前它擴大了錯誤級別。

通常延遲擴展是選擇,但在這裏它不起作用(或如Joey提到的,用/ V:on),因爲它在一個新的cmd上下文中。

在這裏,你可以使用這種方式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

謝謝。也工作。感謝代碼美化提示。如果可能,我確實喜歡簡化,但似乎在我嘗試時,我會介紹更多問題。對於延遲擴展或者如何解釋變量(可能是加載時間和運行時間討論),你有沒有很好的參考資料?無論哪種方式,非常感謝。 – jim 2011-03-23 17:22:42

+0

@jim:對於初學者和專家[Dostips.com](http://www.dostips.com),瞭解批處理的工作方式(專家)[cmd解析一行延遲vs%vs %% var](http ://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/4095133#4095133) – jeb 2011-03-26 19:51:51

1

/V:on選項添加到cmd和使用!errorlevel!代替%errorlevel%其開啓延遲擴展。

+0

謝謝。工作很好。 – jim 2011-03-23 17:13:53