windows批量更改文件名和扩展名

我现在有大概上万个如下格式的文件, 文件名(包括扩展名)为“1537511-MARKETINGMOBILETEXT, INC.-10-K-date-1-14-2013”,扩展名为“-10-K-date-1-14-2013”。我现在需要把文件名更改为“1537511-MARKETINGMOBILETEXT, INC-10-K-date-1-14-2013”(也就是把.去掉),然后把扩展名更改为“.txt”。

因为文件比较多,没法一个个去操作,请问有没有什么批量操作的方法?

十分感谢!

工具/原料

电脑,WINDOWS7系统

1、把要更名的文件放在同一个文件夹中。本文以E:\song\beyond文件夹下的所有mp3歌曲为例。这些MP3文件是直接从网上下载的,现在要去掉文件名中多余的部分,让其更简洁一致。

2、在”开始“菜单文本框中(或运行命令下)输入cmd,回车进入DOS命令行窗口。

3、输入“E:”回车,进入E盘,再输入"cd song\beyond",回车,进入目标文件夹。

4、输入“dir/b>1.xls",回车,就可以把所有文件的文件名输入到1.xls电子表格文件中。可以看到在beyond文件夹中多了一个电子表格文件1.xls。

5、打开1.xls文件。删掉第一行。

6、开始去掉文件夹中的DOS下不允许在文件名中出现的字符如空格、短横线、顿号等。用查找/替换去掉这些符号。再按要求去掉不需要的文字、增加需要的文字。

7、在B1单元格输入(1),向下填充;在C1单元格输入公式"=b1&".mp3",向下填充;在D1单元格输入公式="ren "&c1&" "&row()&"."&a1,注意空格不能掉。向下填充。结果如图所示。

8、把D列中的所有内容复制到记事本中。将记事本内容保存至beyond文件夹中,命名为"ren.bat"文件。

9、打开beyond文件夹。选中所有要改名的文件,对选中的第一个文件点右键,选择“重命名”,输入名称(1)。如果显示了扩展名,则输入名称为(1).mp3。按回车键,所有的文件名会变成一个序列。注意,不能改成其他文件名。否则产生的文件名中会产生空格,这是DOS下文件名中不允许的。

10、双击beyond文件夹中的ren.bat文件。很快所有的文件将自动更改为所需要的文件名。删除1.xls和ren.bat两个文件。

追问

重命名那步(第9步)遇到了问题,在我选择显示扩展名,全部选中,重命名(1).txt之后,扩展名还是没有变。如图。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-02-16
不清楚你的实际文件/情况,仅以问题中的样例/说明及猜测为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理的多个文件放一起双击运行<# :
cls&echo off&cd /d "%~dp0"&mode con lines=5000
rem 批量修改指定文件扩展名/后缀名
set #=Any questions&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
set "self=%~f0"
powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
echo;%#% +%$%%$%/%_% %z%
pause
exit
#>
$oldext=".-10-K-date-1-14-2013";
$newext="-10-K-date-1-14-2013.txt";

function toregex($wildcard){
    $pat=[regex]::replace($wildcard, '[\+\.\^\$\{\}\[\]\(\)]', {
        param($m);
        return ('\'+$m.groups[0].value);
    });
    $pat=$pat.replace('?','.').replace('*','[^\.]*')+'$';
    return $pat;
}

$reg=toregex $oldext;
$self=get-item -literal $env:self;
$current=$self.Directory.FullName.trimend('\');
$files=@(dir -literal $current|?{($self.Name -ne $_.Name) -and ($_ -is [System.IO.FileInfo])});
for($i=0;$i -lt $files.length;$i++){
    $newname=$files[$i].Name -replace $reg,$newext;
    if($newname -ne $files[$i].Name){
        write-host ($files[$i].FullName.Substring($current.length+1)+' --> '+$newname);
        $newfile=$files[$i].Directory.FullName.trimend('\')+'\'+$newname;
        move-item -literal $files[$i].FullName $newfile -ErrorAction SilentlyContinue;
    }
}