2015-10-16 188 views
0

我的腳本用於刪除比n更早的日誌文件。它在特定的上下文中被調用(Spring批處理),它已經初始化了幾個環境變量。Forfiles命令:在目錄路徑中使用斜槓代替反斜槓

這裏的腳本的內容:

set DAYS = 3 
forfiles /p %LOG_PATH% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE" 

正如你所看到的,我沒有的LOG_PATH值的控制。這是在其他地方初始化幷包含用斜槓(而非反斜槓)像這樣的路徑:D:/DATA/LOGS

當我啓動這個劇本我得到的,這個錯誤:The directory name is invalid.

如果我手動寫反斜槓的路徑命令成功。

因此,是否有可能espace環境變量,以便該命令接受斜槓?或者,你將如何繼續在運行時替換反斜槓?

謝謝。

+0

注意,元素相反的是MS當路徑修正docs說''forfiles'中的'/ m *。*'不匹配所有文件。它只會匹配名稱有擴展名的文件。如果你想匹配*所有*文件,你需要'/ m *'。或者完全省略'/ m',因爲'/ m *'是默認值。 – AnT

回答

4

我會嘗試用

set "DAYS=3" 
forfiles /p "%LOG_PATH:/=\%." /s /d -%DAYS% /m *.* /c "cmd /c del @PATH" 

  • %LOG_PATH:/=\%會做斜槓反斜槓更換。
  • 附加引號用於處理空格或特殊字符的問題。
  • 如果變量包含結尾斜線,則在結尾處有一個額外的點以避免問題,該點將轉換爲反斜槓並將轉義引號。
  • 可變%DAYS%定義修改,刪除名稱和值
  • forfiles /s空間請求遞歸搜索,並@FILE只能檢索名稱和文件的擴展名,所以它更改爲@PATH,以確保代碼將只刪除發現的文件超出當前活動目錄。

如果你沒有對%LOG_PATH%內容控制和不知道的變量包含引號,再次引用變量可能會導致更多的問題。一個更安全的版本可能是

set "DAYS=3" 
for %%a in ("%LOG_PATH:"=%.") do (
    forfiles /p "%%~fa" /s /d -%DAYS% /m *.* /c "cmd /c del @PATH" 
) 

凡在變量引號(如果存在)被刪除,請求的完整路徑由for命令引用

+0

非常感謝,該變量可能包含引號,所以我會使用您的安全版本!雖然,我不太清楚我是否理解'@ FILE'和'@ PATH'之間的區別。我以前的腳本是否從子目錄中刪除文件,而你的文件不? – Thrax

+0

@Thrax,[文檔](https://technet.microsoft.com/en-us/library/cc753551%28v=ws.10%29.aspx)說'@ FILE'只是文件名和'@PATH '包含文件的完整路徑。從理論上講,當前活動目錄被設置爲'forfiles'迭代的目錄,以便在該目錄內執行指定的命令,所以不會有任何區別,只是爲了防止出現問題(我們在這裏刪除文件),我習慣於準確地說明代碼應該做什麼。雖然可能根本不需要,但表明完整的路徑更安全。只是一種習慣。 –

+0

是的,我正在閱讀文檔,看看是否可以在沒有找到文件(我設法執行)的情況下抑制'ERRORLEVEL',並且如果我可以回顯刪除的文件數量(仍在工作)。再次感謝! – Thrax

1

嘗試variable search/replace像:

set DAYS = 3 
forfiles /p %LOG_PATH:/=\% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE" 
+0

感謝您的幫助! – Thrax

2

Variable Edit/Replace

==> set "LOG_PATH=D:/DATA/LOGS" 

==> echo %LOG_PATH%  %LOG_PATH:/=\% 
D:/DATA/LOGS  D:\DATA\LOGS 

==> 

一些錯誤:

  v this space 
set DAYS = 3             
forfiles /p %LOG_PATH% /s /d -%DAYS % /m *.* /c "cmd /c del @FILE" 
          ^^^^^^^^^^^      ^^^^^ 
       results to /d - 3       use fully qualified @PATH 
          ^this space     

因此,使用(報價和尾隨點在"%LOG_PATH:/=\%."憑藉MC ND的)

set "DAYS=3" 
forfiles /p "%LOG_PATH:/=\%." /s /d -%DAYS% /m *.* /c "cmd /c del @PATH" 
+0

感謝您的幫助! – Thrax