用powershell批量重命名文件

通配符转义和正则表达式转义

再简单的问题也能遇到挫折。首先需要弄明白这两种转义的区别。

powershell中需要转义的通配符有四个:('*'、'?'、'['和']')

正则表达式需要转义的元字符有:('\'、'*'、'+'、'?'、'|'、'{'、'['、'('、')'、'^'、'$'、'.'、'#' 和空白)

这里有个有趣的地方——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",'') }

学习链接

posted @ 2010-07-30 23:52  ambar  阅读(6177)  评论(0编辑  收藏  举报