批量重命名文件并覆盖文件名已存在(窗口)

时间:2014-12-04 14:47:03

标签: windows powershell batch-file rename file-rename

Dropbox搞砸了我文件夹中的很多文件,所以情况如下: 我现在每个文件都有2个文件名:

1)file。*

2)文件(Home-PC的冲突副本2014-12-04)。*

我要保留的文件是第二个,我想删除第一个文件,所以最终的结果是我只有一个名为file。*(名字)的文件,其中包含第二个文件的内容。 这发生在许多文件夹中的许多文件中,我想批量重命名所有文件,替换第一个文件。

我已尝试在此网站上使用此powershell命令对两个文件a.txt和b.txt(用于试验):

Get-ChildItem . -include *.txt | Move-Item -Destination { $_.name.Replace("a","b")} -Force

但没有用,powershell什么都不做,如果我不使用-Force就会抛出错误。 我没有任何PowerShell或命令提示符的经验,但我可以在尝试上述命令时复制/粘贴命令。

我也尝试过使用其他命令,但失败了:

Get-ChildItem . -include *.txt | Where-Object { $_.name -match "a$" } | Move-Item -destination { $_.name -replace "a$", "b" }

1 个答案:

答案 0 :(得分:0)

假设您理解正则表达式,那么使用批处理与JREN.BAT相结合是相当容易的 - 这是一个混合实用程序,它通过执行正则表达式搜索来重命名文件并替换文件名。 JREN.BAT是纯脚本,可​​以在XP之后的任何Windows机器上本机运行。

我实际上并没有使用JREN进行重命名,而是我通过它来获取文件的MOVEd名称。

您的规格有点模糊。我使用的正则表达式可能需要调整。目前,它会查找<OneOrMoreSpaces>(之前的).<extensionText>的最后一次出现。它会保留<OneOrMoreSpaces>(之前的所有文本以及扩展名。

下面的脚本将打印出将要执行的MOVE命令。从脚本中删除ECHO以实际执行移动操作。

如果原始文件存在,脚本仅移动文件。如果您想要始终移动文件,请删除if exist "%%~dpA%%B"

<强> fixDupes.bat

@echo off
for /f tokens^=1^,3^ delims^=^" %%A in (
  'jren "(.*) +\(.*\)(\..*)" "$1$2" /t %*'
) do (
  if exist "%%~dpA%%B" echo move /y "%%A" "%%~dpA%%B"
)


处理当前目录:

fixDupes


处理C:\myFolder目录

fixDupes /P "C:\myFolder"

以递归方式处理C:\myFolder及其所有子女

fixDupes /P "C:\myFolder" /S

更新: 实际上,我认为扩展程序的正则表达式可能有点错误,因为它会将name (xyz).abc.txt重命名为{{1虽然我想也许它应该留下文件。实际扩展名为name.abc.txt,因此可以说该名称与模板不匹配。以下是仅在真正扩展名之前重命名.txt的文件的修复程序。

(stuff to be removed)