[英]Batch renaming with forfiles, or potentially Powershell
尝试使用forfiles和Powershell批量重命名文件夹中的文件时出现问题。 我遇到的问题是我需要搜索其中带有_T_
文件,所以我使用搜索符号*_T_*.cr2
因为它们都是RAW文件。 在给定的文件夹中,将有143个左右的RAW文件,其中的69个名称中将带有_T_
,其余的则没有。 我要实现的是运行一个快速命令,该命令清除掉所有带有_T_
文件,然后在文件前添加一个额外的_。
所以之前: Ab01_T_gh.cr2
和之后_Ab01_T_gh.cr2
我的问题是,搜索_T_
文件会使命令不断_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 _T_
文件夹,每个子文件夹中都有143个RAW文件。
这工作正常:
@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
)
这是基于原始代码的PowerShell版本:
Get-ChildItem -Filter "*_T_*.cr2" -Recurse |
Where-Object { $_.Name.Substring(0,1) -ne '_' } |
Rename-Item -NewName $("_" + $_.Name)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.