重命名文件,删除部分文件名批处理脚本

时间:2017-01-18 17:04:24

标签: batch-file

我的表格中有一些文件:

filename1 1 extra1.ext
filename1 2.ext
filename1 3 extra2.ext
...
filename2 1.ext
filename2 100 extra3.ext
...
filename20 1.ext
filename20 15 extra100.ext
(etc.)

...其中filename1filename2等可以包含空格,符号'但不包含数字。 extra1extra2等可以包含任何内容。空格包含的文件名中的数字不会重复filename1filename2等。

我想要的是删除包含它的文件的额外东西。也就是说,从filename20 15 extra100.extfilename20 15.ext

我的第一次尝试就是:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "FILE=file name 11 con sosas extras 2.txt"
set "ext=txt"
set "folder=."

for /F "tokens=1,* delims=0123456789" %%A in ("!FILE!") do (set "EXTRA=%%B")
set "FIRST=!FILE:%EXTRA%=!"
set "filename=!FIRST!.!ext!"
echo !EXTRA!
echo !filename!
echo rename "!folder!\!FILE!" "!filename!"

似乎有效,但如果我改变它以接收参数,它就不会:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "FILE=%1"
set "ext=%2"
set "folder=%3"

for /F "tokens=1,* delims=0123456789" %%A in ("!FILE!") do (set "EXTRA=%%B")
set "FIRST=!FILE:%EXTRA%=!"
set "filename=!FIRST!.!ext!"
echo !EXTRA!
echo !filename!
echo rename "!folder!\!FILE!" "!filename!"

其中%1是文件名,%2是扩展名,%3是文件所在的文件夹。也许,扩展可以在批处理中提取,但我不知道该怎么做。

另一方面,我计划将此批次用于另一批。在那里,(*.txt)中会有一个for循环,我不知道如何区分具有额外内容(然后调用此批次)的文件与不具有该功能的文件(然后不会叫这批。)。

此致

2 个答案:

答案 0 :(得分:2)

使用您的方法提取“额外部分”。在第二步中,删除该额外部分:

@echo off
setlocal enabledelayedexpansion

set "FILE=file name 11 con sosas extras 2.txt"

for /f "tokens=1,* delims=1234567890" %%a in ("%file%") do set new=!file:%%b=!%%~xb
echo %new%

%%~xb为您提供了e x 紧张感。

答案 1 :(得分:1)

这是一个批处理脚本,它寻找 SPACEs 中包含的第一个纯数字字符串部分,或者如果它出现在最后,出现 SPACE ,则会发生之后的其他一些文本只包含 SPACEs 。找到的数字前面的部分后跟一个 SPACE ,后跟数字本身用于构建新文件名。

此方法可以正确处理文件名的所有有效字符,甚至是^&%!()

所以这是代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=.\test"

for /F "eol=| delims=" %%F in ('
    dir /B "%_SOURCE%\*.ext" ^| findstr /R /I ^
        /C:"^..* [0123456789][0123456789]*\.ext$" ^
        /C:"^..* [0123456789][0123456789]* .*\.ext$"
') do (
    set "FILE=%%F"
    call :SPLIT FIRST NUM REST "%%~nF"
    if defined NUM (
        setlocal EnableDelayedExpansion
        ECHO rename "!_SOURCE!\!FILE!" "!FIRST! !NUM!%%~xF"
        endlocal
    )
)

endlocal
exit /B


:SPLIT  rtn_first  rtn_num  rtn_rest  val_string
    setlocal DisableDelayedExpansion
    set "RMD=" & set "NUM=" & set "STR=%~4"
    :LOOP
    for /F "tokens=1,2,* delims= " %%I in ("%STR%") do (
        if not "%%J"=="" (
            (for /F "delims=0123456789" %%L in ("%%J") do rem/) && (
                if not "%%K"=="" (
                    set "STR=%%J %%K"
                    goto :LOOP
                )
            ) || (
                set "NUM=%%J"
                if not "%%K"=="" (
                    set "RMD=%%K"
                )
            )
        )
    )
    set "STR=%~4"
    if not defined NUM goto :QUIT
    set "STR=%STR% "
    call set "STR=%%STR: %NUM% =|%%"
    for /F "delims=|" %%L in ("%STR:^^=^%") do set "STR=%%L"
    :QUIT
    (
        endlocal
        set "%~1=%STR%"
        set "%~2=%NUM%"
        set "%~3=%RMD%"
    )
    exit /B

测试完脚本后,删除大写ECHO命令以实际重命名任何文件。

相关问题