使用forfiles或可能的Powershell进行批量重命名

时间:2016-08-10 15:59:11

标签: windows powershell batch-rename

尝试使用forfiles和Powershell批量重命名文件夹中的文件时出现问题。我遇到的问题是我需要搜索其中包含_T_的文件,因此我使用搜索符号*_T_*.cr2,因为它们都是RAW文件。在一个给定的文件夹中,将有143个左右的RAW文件,其中69个将在其名称中有_T_,其余的不会。我想要实现的是运行一个快速命令,清除其中包含_T_的所有文件,然后在文件之前添加一个额外的_。

之前:Ab01_T_gh.cr2_Ab01_T_gh.cr2之后 我的问题是搜索_T_文件导致命令一遍又一遍地执行,因此文件最终看起来像_____________Ab01etc,直到它达到Windows文件名限制。 这是我的forfiles命令的样子:

forfiles /S /M *_T_*.cr2 /C "cmd /c rename @file _@file"

它有效,但效果不错。

我也尝试过Powershell,结果相同。

Get-ChildItem -Filter "*_T_*.cr2" -Recurse | Rename-Item -NewName { "_" + $_.Name} 

或许有一种方法可以将"发现"和"重命名"部分代码?任何帮助将不胜感激!我无法手动分离_T_文件,因为它会非常耗时,因为每个父文件夹有时会有75个子文件夹,每个子文件夹包含143个RAW文件。

2 个答案:

答案 0 :(得分:0)

这很好用:

@echo off

setlocal EnableDelayedExpansion

for %%a in (*_T_.cr2) do (
set z=%%a
set z=!z:~,1!

if not !z!==_ rename %%a _%%a
)

我不得不放弃forfiles,因为我无法使用@变量(可能使用findstr)。 我在模式上使用了一个简单的for循环,只有在没有以下划线开头的情况下才重命名。

递归版:

@echo off

setlocal EnableDelayedExpansion

for /R . %%a in (*_T_.cr2) do (
echo %%~na%%~xa
set z=%%~na
set z=!z:~,1!

if not !z!==_ rename %%a _%%~na%%~xa
)

答案 1 :(得分:0)

这是基于原始代码的PowerShell版本:

Get-ChildItem -Filter "*_T_*.cr2" -Recurse | 
Where-Object { $_.Name.Substring(0,1) -ne '_' } |
Rename-Item -NewName $("_" + $_.Name)