簡體   English   中英

在 Windows 上使用 CMD 從文件目錄中刪除特定的 substring

[英]Using CMD on Windows to remove a specific substring from a directory of files

我經常使用免費的在線無損文件壓縮器來節省磁盤空間並使傳輸和推送存儲庫更容易。 我對壓縮器的主要問題是將“-min”附加到每個文件名的末尾。 由於各種原因,我想通過覆蓋來替換原始文件; 而不是刪除舊文件並保留新文件(使用“新”名稱)。

對於我的 PDF 目錄,我嘗試了這個: FOR /R %f IN (*-min.pdf) DO REN "%f" *.pdf

它似乎正確地找到了所有相應的文件,但它們的名稱保持不變。 我做錯了什么? 是否有一個與文件格式無關的命令,所以我不必為 txt、png 等替換文件擴展名?

我只需要它從每個文件名的末尾(在文件擴展名之前)刪除 -min 。

FOR /R %f IN (*-min.pdf) DO REN "%f" *.pdf

對於一個襯里(在 cmd 提示符處)從以下內容中刪除echo

cmd /v:on /c "for /R %f in (*-min.pdf) do @set "nx=%~nxf" & echo ren "%~ff" "!nx:-min.pdf=.pdf!""

上面可以輕松更改以執行其他字符串操作,它在技術上並非萬無一失,例如它將名為"a-min.pdf.b-min.pdf-c-min.pdf"的文件重命名為"a.pdf.b.pdf-c.pdf." . 如果在這種情況下這是一個問題,請使用以下內容,這與@Mofi 的答案基本相同。

cmd /v:on /c "for /R %f in (*-min.pdf) do @set "nn=%~nf" & echo ren "%~ff" "!nn:~0,-4!%~xf""

可以使用具有以下命令行的批處理文件來完成該任務:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "delims=" %%I in ('dir "%~dp0*-min.*" /A-D /B /S 2^>nul') do (
    set "FullFileName=%%I"
    set "FileNameOnly=%%~nI"
    set "FileExtension=%%~xI"
    setlocal EnableDelayedExpansion
    if /I "!FileNameOnly:~-4!" == "-min" ren "!FullFileName!" "!FileNameOnly:~0,-4!!FileExtension!"
    endlocal
)
endlocal

FOR在后台以%ComSpec% /c啟動的單獨命令進程執行的命令DIR以及作為附加 arguments 輸出附加'之間的命令行以及帶有完整路徑的文件名,如Test-File.-min.x.pdf 出於這個原因, IF條件確保僅重命名文件名真正以字符串-min結尾不區分大小寫的文件,例如Test-File.-MIN.pdf

閱讀有關使用命令重定向運算符的 Microsoft 文檔,了解2>nul的說明。 當 Windows 命令解釋器在執行命令FOR之前處理此命令行時,重定向運算符>必須在FOR命令行上使用脫字符^進行轉義,以便在后台啟動的單獨命令進程中執行嵌入的dir命令行。

要了解使用的命令及其工作原理,請打開命令提示符window,在其中執行以下命令,並仔細閱讀每個命令顯示的所有幫助頁面。

  • call /? ... 解釋%~dp0 ... 驅動器和參數 0 的路徑,它是批處理文件的完整路徑,始終以反斜杠結尾,因此與通配符模式*-min.*連接,沒有額外的反斜杠。 可以刪除%~dp0以在當前目錄及其所有子目錄上運行DIR ,而不是批處理文件目錄及其所有子目錄。
  • dir /?
  • echo /?
  • endlocal /?
  • if /?
  • ren /?
  • set /?
  • setlocal /?

有關命令 SETLOCAL 和 ENDLOCAL 的更多詳細信息,另請參閱此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM