我在为批处理文件编写代码时会遇到一些问题,该代码将替换文件名的第一部分。
假设我们有文件:
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之间有空格
答案 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.txt
,1234.txt
,ab1234cd.txt
,1234abcd.txt
和ab12cd34.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