尝试使用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文件。
答案 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)