用powershell批量重命名文件
通配符转义和正则表达式转义
再简单的问题也能遇到挫折。首先需要弄明白这两种转义的区别。
powershell中需要转义的通配符有四个:('*'、'?'、'['和']')
- 手动转义:抑音符'`'(Escape键下方)
- 自动转义:[Management.Automation.WildcardPattern]::Escape(string)
正则表达式需要转义的元字符有:('\'、'*'、'+'、'?'、'|'、'{'、'['、'('、')'、'^'、'$'、'.'、'#' 和空白)
- 手动转义:反斜杠'\'
- 自动转义:[regex]::escape(string)
这里有个有趣的地方——powershell调用的方法名不区分大小写。当然,这也有好处,打小写比较省力。=_=
预备
目的是替换某文件夹下所有带特定前缀的文件。
$prefix = "[(斯坦福大学)编程方法].Programming.Methodology.(Stanford)."
# 统计数量
(ls *.mp4).count
# 通配符转义
$prefixEscapeTest = [Management.Automation.WildcardPattern]::Escape($prefix)
# echo $prefixEscapeTest
# 结果:"\`[\(斯坦福大学\)编程方法\`].Programming.Methodology.\(Stanford\)."
# 正则表达式转义。
$prefix = [regex]::escape($prefix)
# 结果:"\[\(斯坦福大学\)编程方法]\.Programming\.Methodology\.\(Stanford\)\."
echo $prefix
Rename-Item
ls *.mp4 | %{ ren $_ ($_.name -replace "^$prefix",'') }
# 报错
#Rename-Item : 无法重命名,因为“M:\vid\[(斯坦福大学)编程方法].Programming.Methodology.(Stanford).Lecture01.mp4”处不存在项。
#所在位置 G:\Users\Lj\Documents\reg.ps1:19 字符: 18
#+ ls *.mp4 | %{ ren <<<< $_ ($_.name -replace "^$prefix",'') }
# + CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
# + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
Move-Item
-LiteralPath <string[]> 指定指向项的当前位置的路径。与 Path 不同,LiteralPath 的值严格按照所键入的形式使用。不会将任何字符解释为通配符。如果路径包括转义符,请将其括在单引号中。单引号会告知 Windows PowerShell 不要将所有字符都解释为转义序列。
用移动的方法来重命名是根据这篇文章想出来的办法,Rename-Item and square brackets in PowerShell (no -LiteralPath):
ls *.mp4 | %{ mi -literalpath $_ ($_.name -replace "^$prefix",'') }