2017-06-22 147 views
0

我在windows文件夾中有很多文件。這些文件名也包含很多下劃線。例如:重命名文件的windows批處理腳本

ad_iod_errr_opp12.txt 
ghff_jjk56.txt 
opr_sdr_ot_wrr_12ee.txt 

我想重命名這些文件,以使最後的底線,一切跟隨它被刪除,文件被重命名如下:

ad_iod_errr.txt 
ghff.txt 
opr_sdr_ot_wrr.txt 

注:下劃線的數量各不相同。某些文件名可能只有一個下劃線,而其他文件名最多可能有8個下劃線。我正在尋找一個Windows批處理腳本,可以做到這一點,而不是PowerShell命令。

這是我使用目前重命名考慮到文件名有它只是一個下劃線文件中的代碼:

@ECHO OFF 
SETLOCAL 
cd C:\Users\ambika.narayan.rao\JenkinsWorkspace 
SET "fname=*.txt" 
FOR %%i IN ("%fname%") DO FOR /f "delims=_" %%j IN ("%%i") DO ren "%%~i" "%%~j%%~xi" 
GOTO :EOF 
+1

@ECHO OFF SETLOCAL cd C:\ Users \ ambika.narayan.rao \ JenkinsWorkspace SET「fname = *。txt「 FOR %% i IN(」%fname%「)DO FOR/f」delims = _「%% j IN(」%% i「)DO ren」%%〜i「」%%〜j %% 〜xi「 GOTO:EOF這是我目前使用的代碼來重命名文件,因爲文件名只有一個下劃線 – UserA

回答

1
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*_*.txt" ' 
) DO (
SET "filename=%%a" 
set "partsname=!filename:_= _!" 
FOR %%b IN (!partsname!) DO SET "newname=!filename:%%b=!%%~xa" 
ECHO REN "%sourcedir%\%%a" "!newname!" 
) 

GOTO :EOF 

你需要改變的sourcedir設置,以適應你的情況。

爲了測試目的,所需的REN命令僅僅是ECHO驗證命令是否正確後,將ECHO(REN更改爲REN以實際重命名文件。

執行與掩碼匹配的所有文件名的目錄掃描。每個名字發現,使用延遲擴展,指定名稱filename然後替換每個_空間 _

用一個簡單的for分配newname到原來的文件名與_string刪除(由沒有代替)並使用%%~xa添加擴展名。分配給%%b的最後一個字符串將爲_laststring.ext,因此分配給newname的值將符合處理要求,因此請重命名該文件。

+0

儘管我喜歡這個基本概念,但是如果有一個文件'test_A.txt_A.txt' ... – aschipfl

0

這裏是一個修改腳本,我張貼在another answer,依靠不錯的黑客刪除由某個字符分隔字符串的最後一部分 - 在這種情況下,下劃線_。請注意,如果任何文件的名稱中都包含感嘆號!,則會失敗。因此,這是代碼:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_SOURCE=%~dp0." 
set "_MASK=*_*.txt" 

rem // Enumerate all matching files: 
for /F "delims= eol=|" %%F in ('dir /B /A:-D "%_SOURCE%\%_MASK%"') do (
    rem // Store current file name and extension: 
    set "FILE=%%~nF" & set "FEXT=%%~xF" 
    rem // Call sub-routine that removes the last `_`-separated part: 
    call :GET_LAST_ITEM LAST RMND "%%~nF" 
    rem // Enable delayed expansion to be able to read the variables: 
    setlocal EnableDelayedExpansion 
    rem /* Actually rename current file: */ 
    ECHO ren "!FILE!!FEXT!" "!RMND!!FEXT!" 
    endlocal 
) 

endlocal 
exit /B 


:GET_LAST_ITEM rtn_last rtn_without_last val_string 
    ::This function splits off the last `_`-separated item of a string. 
    ::Note that exclamation marks must not occur within the given string. 
    ::PARAMETERS: 
    :: rtn_last   variable to receive the last item 
    :: rtn_without_last variable to receive the remaining string 
    :: val_string   original string 
    setlocal EnableDelayedExpansion 
    set "STR=,%~3" 
    set "PRE=" & set "END=%STR:_=" & set "PRE=!PRE!_!END!" & set "END=%" 
    endlocal & set "%~1=%END%" & set "%~2=%PRE:~2%" 
    exit /B 

爲了能夠同時處理與正確感嘆號的文件名,這裏是一個不同的方法:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_SOURCE=%~dp0." 
set "_MASK=*_*.txt" 

rem // Enumerate all matching files: 
for /F "delims= eol=|" %%F in ('dir /B /A:-D "%_SOURCE%\%_MASK%"') do (
    rem // Store current file name and extension: 
    set "FILE=%%~nF" & set "FEXT=%%~xF" 
    rem // Initialise some variables: 
    set "NAME=" & set "ITEM=" 
    rem // Toggle delayed expansion to not lose `!` in file names: 
    setlocal EnableDelayedExpansion 
    rem /* Loop through all partial file names separated by `_`; since every 
    rem `_` is replaced by `" "` and the whole string is enclosed in `""`, 
    rem we effectively get a list of quoted file name parts, which were 
    rem originally separated from each other by `_`: */ 
    for %%I in ("!FILE:_=" "!") do (
     rem /* Rebuild file name but delayed by one name part; the `for /F` loop 
     rem iterates once and transports the result beyond `endlocal`: */ 
     for /F "delims= eol=|" %%E in ("!NAME!!ITEM!_") do (
      endlocal 
      set "NAME=%%E" 
     ) 
     rem // Belatedly store currently iterated file name part: 
     set "ITEM=%%~I" 
     setlocal EnableDelayedExpansion 
    ) 
    rem /* Actually rename current file; superfluous leading and trailing `_` 
    rem are removed from the rebuilt file name: */ 
    ECHO ren "!FILE!!FEXT!" "!NAME:~1,-1!!FEXT!" 
    endlocal 
) 

endlocal 
exit /B 

在已經成功地測試腳本,除去上-case ECHO命令實際重命名任何文件!