2017-02-15 98 views
0

我目前正在處理我的第一個初級IT職位,並且遇到了一個簡單的批處理文件問題。計劃文件夾清理 - 批處理文件

本質上,該文件每週通過任務計劃程序運行。它從大於8天的服務器目錄中刪除文件和文件夾。它也應該刪除空的文件夾。

forfiles /p "P:\blahblah" /s /m * /d -8 /c "cmd /c del /Q /S /F /A @path" 
cd /d P:\blahblah 
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d" 
REM robocopy "P:\blahblah" "P:\blahblah" /s /move" 

這裏有兩個問題; 它會偶爾刪除幾天前的文件。 它不會刪除空文件夾。

該文件是由一位老初級IT員工編寫的,沒有任何文檔。我的猜測是使用了多種方法來確保清理(具有諷刺意味)。我已經搜索谷歌,這裏是我對每個命令的當前想法..

1)forfiles - forfiles命令似乎寫入正確,我沒有看到任何問題。 3)for - 不完全確定。3)for - 不完全確定。3)for - 不完全確定。批處理變量對我來說是新的,我不確定它是否正常工作。

4)robocopy - 我一直無法在網上找到一個實例,在那裏有人將一個目錄複製到自己進行清理。我還注意到那裏有額外的引文,但我不確定它的錯誤。這條線對我來說似乎很奇怪。

通常我會嘗試和測試我通過類似的東西,但它有點難以快速測試,因爲我需要看看它是否基於日曆日期去除東西。這就是我來這裏的原因!

我保證我不會問我是否已經在互聯網上尋找一個想法。任何幫助將不勝感激,我想更多地瞭解上述命令!

感謝您的幫助!

+0

您的FOR命令將失敗,因爲它缺少脫字符以逃脫PIPE。另外,FOR命令應該使用delims選項來強制它不使用任何分隔符。你不應該需要usebackq選項。 Robocopy不會執行,因爲它是用REM命令註釋掉的。 – Squashman

回答

0
  1. forfiles

    作爲語法正確並不意味着你想要做什麼,它做什麼你問。這裏的問題是del命令。它會刪除forfiles已選擇的內容,但您應該測試所選元素不是文件夾。如果您使用文件夾引用呼叫del /q /s /f /a,則會刪除文件夾內容。

  2. cd

    很簡單,但是你不檢查操作是SUCESSFUL(也許P:不可用)也許下面for命令,其中它不應該刪除的信息。

  3. for

    由於Squashman評論,如果你改變了反引號爲單引號,你不會需要usebackq

    但是您需要delims子句來避免包含空格的路徑出現問題。for /f不會遍歷文件引用,而是遍歷文本行(在本例中,由dir命令生成)。默認情況下,製表符和空格是分隔正在處理的行的分隔符,並且默認情況下,只檢索第一個標記。將delims子句設置爲空的字符列表將禁用此行爲。

你可以嘗試的東西像

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     forfiles /s /m * /d -8 /c "cmd /c if @isdir==FALSE del /q /f /a @path" 
     for /f "delims=" %%d in ('" dir /ad /s /b | sort /R "') do rd "%%d" 
     popd 
    ) 

pushd將當前的活動目錄切換到所需之一。如果命令成功,則條件運算符&&(如果前一個沒有失敗,則執行下一個命令)將執行其餘代碼,最後恢復活動目錄。

4)robocopy

它可以用來做清潔,而不是從一個文件夾到自身。

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     rem Use a random temporary folder 
     for %%t in ("%temp%\clean_%random%%random%%random%%random%.tmp") do (

      rem Select the files to keep 
      robocopy "." "%%~ft" /MAXAGE:8 /CREATE /s /njh /njs /nfl /nc /ns 

      rem Remove anything not selected 
      robocopy "%%~ft" "." /NOCOPY /PURGE /e /njh /njs /nfl /nc /ns 

      rem remove temporary folder 
     ) & rd /s /q "%%~ft" 

     rem Restore previous active directory 
     popd 
    ) 

此代碼創建所有選中的文件(年齡不超過8天)到一個臨時文件夾的副本,但/CREATE開關告訴robocopy不復制文件,而是要創建0字節文件到臨時目標。

一旦我們有一個副本只有選定的元素,oposite操作完成後,從臨時文件夾到工作文件夾,但請求不應複製操作(/NOCOPY),只是刪除元素不存在源( /PURGE)。

+0

感謝您的幫助MD。我會看看這個並更新我的結果。 – Boognish