【问题标题】:windows batch script for renaming files用于重命名文件的 Windows 批处理脚本
【发布时间】:2018-05-10 08:50:25
【问题描述】:

我在 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 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 这是我目前用来重命名文件的代码文件名中只有一个下划线。

标签: windows batch-file


【解决方案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 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(REN 更改为REN 以实际重命名文件。

对所有匹配掩码的文件名执行目录扫描。找到每个名称后,使用延迟扩展,将名称分配给 filename,然后将每个 _ 替换为 Space_

使用简单的fornewname 分配给删除_string(替换为nothing)的原始文件名,并使用%%~xa 添加回扩展名。分配给%%b 的最后一个字符串将是_laststring.ext,因此分配给newname 的值将符合处理要求,因此请重命名文件。

【讨论】:

  • 虽然我喜欢基本的想法,但如果有文件test_A.txt_A.txt... 恐怕会失败
【解决方案2】:

这是我在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

成功测试脚本后,删除大写的ECHO 命令以实际重命名所有文件!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多