這應該很簡單,我只想要一個 bat 檔案,當它放在檔案夾中時會重命名檔案夾中的所有檔案并洗掉最后 4 個字符,但不洗掉擴展名
前任。
img (1).jpg
變成
img.jpg
我試過了
@echo off
setlocal enabledelayedexpansion
if not exist %1 goto :eof
for /f %%A in ('find /V /C "" ^<%1') do set lines=%%A
for /f "tokens=1,* delims=[]" %%A in ('find /V /N "" ^<%1') do (
if %%A LSS %lines% (
echo %%B
) else (
set rec=%%B
echo !rec:~0,-4!
)
)
但它不起作用。沒有錯誤,它運行,它只是不做任何事情
uj5u.com熱心網友回復:
檔案名以空格和圓括號中的單個數字結尾的當前目錄中的所有 *.jpg 和 *.jpeg 檔案的檔案重命名任務可以使用具有以下命令列的批處理檔案完成:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir "* (?).jpg" "* (?).jpeg" /A-D /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R /C:" ([0123456789])\.jpe*g$"') do (
set "FileName=%%~nI"
setlocal EnableDelayedExpansion
ren "!FileName!%%~xI" "!FileName:~0,-4!%%~xI"
endlocal
)
endlocal
該代碼也適用于在要洗掉的檔案名的最后四個字符之前包含一個或多個感嘆號和一個或多個圓括號的影像檔案名。
注意:如果當前目錄包含這兩個檔案并且在將第二個檔案重命名為時,命令REN會輸出一條錯誤訊息,因為在第一個檔案已重命名為. 同一目錄下不能有兩個同名檔案。photo (1).jpgphoto (2).jpgphoto.jpgphoto.jpg
要了解使用的命令及其作業原理,請打開命令提示符視窗,在其中執行以下命令,并仔細閱讀每個命令顯示的所有幫助頁面。
dir /?echo /?endlocal /?findstr /?ren /?set /?setlocal /?
閱讀有關使用命令重定向運算子2>nul的 Microsoft 檔案,了解和的說明|。當 Windows 命令解釋器在執行命令FOR之前在后臺啟動的單獨命令列程中執行嵌入式命令列時,重定向運算子>和|必須^在FOR命令列上使用脫字符號轉義以被解釋為文字字符。
uj5u.com熱心網友回復:
我修改了你的代碼如下:
1/ 切換到測驗目錄 (PUSHD testdirectoryname) 并回傳 (POPD)
2/ 更改%1為固定檔案名
3/ 插入一些除錯行
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following setting for the source directory includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
PUSHD "%sourcedir%"
if not exist q71992787.txt goto :eof
TYPE "%sourcedir%\q71992787.txt"
for /f %%A in ('find /V /C "" ^<q71992787.txt') do set lines=%%A
SET li
find /V /N "" <q71992787.txt
for /f "tokens=1,* delims=[]" %%A in ('find /V /N "" ^<q71992787.txt') do (
if %%A LSS %lines% (
echo %%B
) else (
set rec=%%B
echo !rec:~0,-4!
)
)
POPD
GOTO :EOF
結果,除了除錯行之外,是 file 中的檔案名串列,而
q71992787.txt不是最后一個檔案名,它被縮短了 4 個字符。
這與您的結果“它什么都不做”不同。這就是我提到它的原因。
所以 - 你的解決方案:
我看不出有什么理由計算檔案中的行數。例如,如果有 10 行,那么使用“find /v /n”再次讀取同一個檔案仍然會找到 10 行。
如果(行號)小于10,則將if %%A LSS %lines%(檔案名);也就是說,從 1 到 9 - 只顯示檔案名。echo %%B%%ALSS
else只有在 10 或更大時才會處理該子句%%A,因此僅在最后一行。
我敢肯定這不是你打算做的。
我建議您set "var1=value"用于設定STRING值 - 這可以避免尾隨空格引起的問題。設定算術值不需要引號(set /a`)
在哪里更改檔案名,設定rec為%%B表示整個檔案名,%%B. 你沒有向我們展示檔案中的樣本%1,所以我假設它img (1).jpg就像你的敘述中提到的那樣。rec因此將變為img (1).jpg然后img (1)通過洗掉字串的最后 4 個字符來縮短。
由于您似乎想洗掉名稱部分的最后 4 個字符并保留擴展名,因此您需要閱讀for( for /? from the prompt) 的檔案,它會告訴您
set "rec=%%~nB"
將只分配名稱部分,然后您可以
set "rec=!rec:~0,-4!%%~xB"
echo !rec:~0,-4!%%~xB
設定或顯示被操縱的名稱。
至于為什么你根本沒有結果;這可能是因為檔案編碼%1是 unicode 或 *nix 格式(不是行尾)
而且我確實希望您不要使用 *nix 模擬器,例如cygwinwherefind成為檔案定位器,而不是字串分析器。
uj5u.com熱心網友回復:
在 PowerShell 中執行此操作會容易得多
ls *.jpg |% { ren $_ -ne ($_.BaseName.Substring(0, $_.BaseName.Length - 4) $_.Extension) -wi }
-wi或者-WhatIf是干運行的選項。檢查新名稱是否正常后,您可以洗掉該選項。沒有別名的完整命令列:
Get-ChildItem -File *.* | ForEach-Object { Rename-Item -WhatIf -Path $_ `
-NewName ($_.BaseName.Substring(0, $_.BaseName.Length - 4) $_.Extension) }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463734.html
標籤:批处理文件
