重命名文件的windows批处理脚本
我在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
@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
的值将符合处理要求,因此请重命名该文件。
尽管我喜欢这个基本概念,但是如果有一个文件'test_A.txt_A.txt' ... – aschipfl
这里是一个修改脚本,我张贴在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
命令实际重命名任何文件!
@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