使用批处理重命名文件名的第一部分

时间:2016-09-20 22:46:09

标签: batch-file rename file-rename batch-rename

我在为批处理文件编写代码时会遇到一些问题,该代码将替换文件名的第一部分。

假设我们有文件:

  

abcd123.txt
  abcd345.txt

数字部分(和扩展名)是我要保留的部分,并将其更改为blabla123.txt和blabla345.txt
数字部分并不总是相同。

我试着写:

set FILE =%1
set LastPart =  %FILE:~-7%
set NewName =   c:\MyFolder\blabla%LastPart%
ren %FILE% %NewName%

但它没有用,因为c:\ MyFolder \ blabla到123.txt之间有空格

3 个答案:

答案 0 :(得分:0)

请查看以下脚本是否有助于您。它遍历给定目录中的所有文件,并根据您的要求重命名它们。

$file = fopen('/home/user/log.txt', 'r');
$array = [];

if ($file) {
  while (($line = fgets($file)) !== false) 
  {
     if (preg_match('~^/[^:]+~m', $line, $files)) 
     { //match everything until the first ':' to get file names
         array_push($array, $files);
     }
  }
}

var_dump($array);

<强>输出

  

E:&gt; dir / b&#34; E:\ Temporary \ SO \ batch \ Input - Space&#34;

     

adadadadad123.txt

     

E:&GT;临时\ SO \批次\ test_ren.bat

     

请输入包含文件的目录的完整路径,如果有,请使用双引号   空格:&#34; E:\ Temporary \ SO \ batch \输入 - 空格&#34;

     

E:&gt; dir / b&#34; E:\ Temporary \ SO \ batch \ Input - Space&#34;

     

hello123.txt

答案 1 :(得分:0)

也许:

SET "OldName=%~n1"
SET "Ext=%~x1"
SET "LastPart=%OldName:~-3%"
SET "FirstPart=blabla
SET "NewFold=C:\MyFolder"
REN "%~1" "%NewFold%\%FirstPart%%LastPart%%Ext%"

答案 2 :(得分:0)

虽然这个问题对我来说不是很清楚,但我决定提供一个答案,因为从字符串末尾提取数字部分的任务看起来并不是那么简单,特别是在前面的字符串和数字部分可能有不同的长度。

所以这是一个脚本,接受作为命令行参数提供的文件路径/名称/模式,拆分数字部分,为它添加一个可选前缀并相应地重命名文件(实际上它只是回显ren用于测试的命令行;删除大写ECHO以实际重命名):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "PREFIX="

for %%F in (%*) do (
    for /F "tokens=1-2 delims=0123456789 eol=0" %%K in ("_%%~nF") do (
        if "%%L"=="" (
            set "FLOC=%%~F"
            set "FILE=%%~nF"
            set "FEXT=%%~xF"
            set "FNEW="
            setlocal EnableDelayedExpansion
            set "FILE=_!FILE!"
            for /L %%E in (0,1,9) do (
                set "NAME=!FILE:*%%E=%%E!"
                if not "!NAME!"=="!FILE!" (
                    if 1!NAME! GTR 1!FNEW! (
                        set "FNEW=!NAME!"
                    )
                )
            )
            ECHO ren "!FLOC!" "!PREFIX!!FNEW!!FEXT!"
            endlocal
        )
    )
)

endlocal
exit /B

该脚本会跳过名称中包含少于或多于一个数字部分的所有文件,以及数字部分后跟文件扩展名以外的文件。例如,处理abcd1234.txt,而跳过abcd.txt1234.txtab1234cd.txt1234abcd.txtab12cd34.txt。请注意,数字部分限制为九位小数。

如果九位数的限制令人不安,可以使用以下脚本。它与前面提到的非常相似,但是数字比较已被字符串比较所取代,前导零填充的数字具有相同的长度。因此,字符串比较提供与纯数字比较相同的结果:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "PREFIX="

set /A "DIGS=256"
setlocal EnableDelayedExpansion
for /L %%E in (1,1,%DIGS%) do set "PADZ=!PADZ!0"
endlocal & set "PADZ=%PADZ%"
for %%F in (%*) do (
    for /F "tokens=1-2 delims=0123456789 eol=0" %%K in ("_%%~nF") do (
        if "%%L"=="" (
            set "FLOC=%%~F"
            set "FILE=%%~nF"
            set "FEXT=%%~xF"
            set "FNEW="
            setlocal EnableDelayedExpansion
            set "FILE=_!FILE!"
            for /L %%E in (0,1,9) do (
                set "NAME=!FILE:*%%E=%%E!"
                if not "!NAME!"=="!FILE!" (
                    set "CMPN=%PADZ%!NAME!"
                    set "CMPF=%PADZ%!FNEW!"
                    if "!CMPN:~-%DIGS%!" GTR "!CMPF:~-%DIGS%!" (
                        set "FNEW=!NAME!"
                    )
                )
            )
            ECHO ren "!FLOC!" "!PREFIX!!FNEW!!FEXT!"
            endlocal
        )
    )
)

endlocal
exit /B