批次檔替換“.”和 ”-”

批次檔替換“.”和 ”-”

我需要保留檔案副檔名,並且需要透過子資料夾進行工作。

例如:“File.name.ext”應變為“File-name.ext”

我對 shell 腳本一無所知,所以請在您的回覆中詳細說明。我不知道任何開關意味著什麼,甚至不知道如何指定路徑。

答案1

我實際上完全同意另一個答案。 GUI 批次重命名實用程式是所以使用起來更方便。但是,只是為了好玩,我編寫了以下批次文件,該文件應該遞歸地重命名當前目錄中的所有文件。和子目錄。並替換 .與 - (例如“長.文件。 .name.ext“ 會變成 ”長-文件--name.ext”):

@echo off
setlocal enabledelayedexpansion
for /r %%f in (*.*) do (
    set fn=%%~nf

    REM Remove the echo from the following line to perform the actual renaming!
    if not [!fn!]==[] if not ["%%~nxf"]==["!fn:.=-!%%~xf"] echo ren "%%~f" "!fn:.=-!%%~xf"
)
pause

執行批次檔一次,然後如果輸出看起來令人滿意,則透過刪除單字echo(第二個實例,而不是第一行)並重新執行檔案來執行實際重新命名。

答案2

我不知何故無法理解為什麼你要費心處理批次檔。為什麼不使用無數 GUI 重新命名工具之一,例如:

http://www.beroux.com/english/softwares/renameit/

如果那個特定的人不能讓你的船漂浮,請查看這個遊行:

http://www.techsupportalert.com/best-free-rename-utility.htm

答案3

這是我經過測試的批次檔的最終版本,可以執行您想要的操作。它適用於帶有或不帶有文件名或擴展名的文件,但是文件名包含%!引起麻煩

它使用延遲擴展,因此您必須從打開延遲擴展的命令提示字元運行它(簡單地運行setlocal /enabledelayedexpansion不會削減它,因為這只會切換它如果已經啟用;如果在命令提示字元運行時未啟用它則無效)。

您可以透過使用開關開啟命令提示字元來開啟延遲擴展/V:ON,但您也可以從現有命令提示字元執行此操作,如下面的批次檔所示。

@echo off

:: This batch file (prints the command to) rename files so that
:: any dots (.) are replaced with dashes (-)
::
:: Note, files with names containing percents (%) and exclamantions (!)
:: will intefere with command-prompt syntax and are not supported, but
:: can be worked around: https://stackoverflow.com/questions/5226793/

:: If this batch-file has no parameters...
if [%1]==[] (
    :: Open a new command-prompt with delayed-expansion enabled and call self
    cmd /v:on /c "%0" +
    :: Quit
    goto :eof
)

:: Recurse through all files in all subdirectories
for /r %%i in (*) do (

    rem (:: cannot be used for comments in a FOR loop)
    rem Check if it has an extension
    if [%%~xi]==[] (
        rem If it has an extension, preserve it
        set RENFN=%%~nxi
    ) else (
        rem Copy the path (and filename)
        set RENFN=%%~ni
        rem Check if it has a filename
        if not [%%~ni]==[] (
            rem If it has a filename, replace dots with dashes
            set RENFN=!RENFN:.=-!
        )
    )

    rem Rename original file
    ren "%%i" "!RENFN!%%~xi"

)

:: Exit spawned shell (no need to use setlocal to wipe out the envvar)
exit

:: Test output:
::
:: C:\t> dir /b/a
::
:: .txt
:: blah
:: file.blah.txt
:: foo.bar.txt
:: super duper. .blah.ttt. omergerd.---.mp4
:: t.bat
::
:: C:\t> t.bat
::
:: ren "C:\t\.txt" ".txt"
:: ren "C:\t\blah" "blah"
:: ren "C:\t\file.blah.txt" "file-blah.txt"
:: ren "C:\t\foo.bar.txt" "foo-bar.txt"
:: ren "C:\t\super duper. .blah.ttt. omergerd.---.mp4" "super duper- -blah-ttt- omergerd----.mp4"
:: ren "C:\t\t.bat" "t.bat"

相關內容