你正在運行到您的主要問題是,第一個參數,以任志強能夠接受完整的路徑信息,但第二隻可包含不包含路徑信息的新名稱。您可以使用~nx
修飾符從FOR/F命令報告的完整路徑中提取名稱和擴展名。
您的FOR/F選項不可靠 - 如果文件名包含=
,它將會中斷。您想將分隔符設置爲無。
這個問題其實比第一次看起來更復雜。您的代碼將嘗試重命名文件和目錄。如果你想重命名這些目錄,那麼你必須以相反的字母順序重命名,因爲整個列表是在任何事物被重命名之前構建的。如果按正常的字母順序進行處理並重命名一個目錄,則該目錄中的後續條目將不會被找到。
IN()子句中的FIND過濾器不是必需的。理想情況下,您的過濾器應該只匹配文件或目錄名稱,而不是路徑。這是可行的,但有點棘手。我會簡單地跳過IN()子句中的過濾,然後在DO子句中執行。
文件或目錄名稱可以包含!
字符。但是,如果FOR變量擴展包含!
並且啓用了延遲擴展,它將被破壞。這個問題可以通過在循環中打開和關閉延遲擴展來避免。
通過搜索和替換可以刪除整個名稱,但不能將文件重命名爲空。所以我添加了一個測試來確保有一個名字。
setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b ^| sort /r') do (
set "old=%%F"
set "file=%%~nxF"
setlocal enableDelayedExpansion
set "new=!file:%X%=!"
if defined new if !new! neq !file! ren "!old!" "!new!"
endlocal
)
如果您不想重命名目錄,則需要添加/ A-D選項。我首先想到可以使用FOR/R語句,但這可能會導致同一個文件被重命名兩次。在處理任何文件之前,FOR/F會緩衝整個結果集,但FOR/R不會。
setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b /a-d') do (
set "old=%%F"
set "file=%%~nxF"
setlocal enableDelayedExpansion
set "new=!file:%X%=!"
if defined new if !new! neq !file! ren "!old!" "!new!"
endlocal
)