删除部分文件名时重命名文件名

时间:2017-06-19 14:38:42

标签: windows batch-file cmd

我有一个文件夹,它包含数百个文本文件,我想重命名它。

文件名ABCD01 %%。txt或CAT9999&#。txt或FILENAME2345& ^ $ .txt

我想重命名文件,以便任何介于'数字'之间的内容和' .txt'应该删除

例如

  • ABCD01 %%。txt变为ABCD01.txt

  • CAT9999&#。txt成为CAT9999.txt

  • FILENAME2345& ^ $。txt成为FILENAME2345.txt

到目前为止

代码:

@echo off
for /f "tokens=*" %%f in ('dir /l /a-d /b *.txt') do (
    for /f "tokens=1 delims=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" %%n in ("%%~nf") do (
        echo File: %%~nxf = value %%n

    rename %%~nxf *%%n.txt



    )
)

我得到的另一个解决方案是rename 's/[^a-zA-Z0-9_]//g' *.txt,我试图将它移植到Windows但我不能..如何将上述命令移植到Windows(批处理)

2 个答案:

答案 0 :(得分:2)

我遇到了一些转义字符的问题,我不得不使用稍微不同的方法。这个脚本应该可以工作:

setlocal enabledelayedexpansion
for %%f in (*.txt) do (
    set name=%%~nf
    for /f "delims=0123456789 tokens=2" %%r in ("%%~nf") do set replace=%%r
    set "replace=name:!replace:^^=!="
    for /f %%x in ("!replace!") do set replace=!%%x!
    ren "!name!.txt" "!replace!.txt"
)

编辑:此修订后的脚本会查找文件名中的最后一个数字。 [不介意错误,它们对实际重命名没有任何影响。]

setlocal enabledelayedexpansion
for %%f in (*.txt) do (
    set name=%%~nf
    set p=0
    for /l %%# in (2 1 32) do (
        for %%e in ("!name:~-%%#,1!") do (
            echo.%%~e|findstr /r /i "[0-9]"&&if !p!==0 set /a p=%%#-1
        )
    )
    set "new=name:~,-!p!"
    for %%e in ("!name:~-1!") do echo.%%~e|findstr /r /i "^[0-9]"&&set new=name
    for /f %%x in ("!new!") do ren "!name!.txt" "!%%~x!.txt"
)

编辑:针对“&&”的特殊情况再次修改。 for循环中的延迟扩展可能很乏味。现在,字符不会再破坏语法(这意味着要忽略的错误已经停止)。

答案 1 :(得分:2)

假设没有重复的重命名,并且假设只有字母和数字构成文件名的第一部分,则以下代码将重命名文件。如果您对正确完成重命名感到满意,请从-WhatIf命令中删除Rename-Item

Get-ChildItem -File -Filter '*.txt' |
    Where-Object { $_.Name -match '([A-Za-z0-9]*).*\.txt' } |
    ForEach-Object { Rename-Item $_.FullName "$($matches[1]).txt" -WhatIf }

如果您没有在PowerShell中运行,请将代码放入renfunc.ps1文件并从cmd .bat脚本中调用它。

powershell -NoProfile -File 'renfunc.ps1'