2012-08-17 52 views
0

我想在用戶輸入想要從文件名中刪除的字符串後重命名文件。這工作得很好,除了當我想要重命名是在不同的位置比腳本文件:批處理:使用輸入字符串重命名多個文件

這裏是我有這麼遠,如果我不特定的文件路徑,其工作(如刪除C:\DATABASE\*.* /s

SET /P X=Type in the String that you want to remove and then press ENTER: 

set deletestring=%X% 
for /f "delims==" %%F in ('dir C:\DATABASE\*.* /s /b ^| find "%deletestring%"') do (
    set oldfilename=%%F 
    set newfilename=!oldfilename:%deletestring%=! 
    Ren "!oldfilename!" "!newfilename!" 
    ) 

謝謝!

回答

0

改爲使用它。例如: -

remove *.* 

remove "relative path\*.*" 

remove C:\DATABASE\*.* 

remove "C:\My Database\2010-*.bak" 

含義,必須指定一個目錄和文件掩碼。這裏的remove.bat文件:

@echo off 
setlocal enabledelayedexpansion 
set mask=%~1 
set mask=!mask:%~dp1=! 
if not exist "%~1" (
    echo No files found 
    goto :eof 
) 
pushd "%~dp1" 

SET /P X=Type in the String that you want to remove and then press ENTER: 

set deletestring=%X% 
for /f "delims==" %%F in ('dir "%mask%" /s /b ^| find "%deletestring%"') do (
    set oldfilename=%%F 
    set newfilename=!oldfilename:%deletestring%=! 
    Ren "!oldfilename!" "!newfilename!" 
) 
0

你正在運行到您的主要問題是,第一個參數,以任志強能夠接受完整的路徑信息,但第二隻可包含不包含路徑信息的新名稱。您可以使用~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 
) 
相關問題