我的表格中有一些文件:
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.)
...其中filename1
,filename2
等可以包含空格,符号'
但不包含数字。 extra1
,extra2
等可以包含任何内容。空格包含的文件名中的数字不会重复filename1
,filename2
等。
我想要的是删除包含它的文件的额外东西。也就是说,从filename20 15 extra100.ext
到filename20 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循环,我不知道如何区分具有额外内容(然后调用此批次)的文件与不具有该功能的文件(然后不会叫这批。)。
此致
答案 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
命令以实际重命名任何文件。