在PowerShell中批量重命名

我试图更新一堆.jpg图片,以便在我的网站上刷新。 他们目前存储在我的电脑上,就像这样:

 媒体
 +  - 随机项目
 |  +  -  1.jpg
 |  +  -  2.jpg
 |  +  -  3.jpg
 |  ` -  thumb.png
 +  - 另一个随机项目
 |  +  -  1.jpg
 |  ` -  thumb.png 

我试图批量重命名所有1.jpg, 2.jpg 1a.jpg, 2a.jpg

我正在考虑使用Windows PowerShell等

 Get-ChildItem -Recurse -Filter "[0-9]+.jpg" | foreach { $_.FullName} Dir *.jpg | Rename-Item -NewName { $_.Name -replace "[0-9]+.jpg","[0-9]a.jpg" } 

但之前从未使用该程序。 你怎么看?

Solutions Collecting From Web of "在PowerShell中批量重命名"

  • 如果可用, 使用-Filter参数总是值得的 :它在源处执行过滤因此通常比稍后过滤快得多。

  • -Filter参数接受的(字符串)值的语法cmdlet – / PowerShell驱动器特定的
    对于Get-ChildItem (及其内置别名dir以及Windows PowerShell中的ls ),它接受单个通配符表达式 PowerShell自己的通配符表达式 类似 ,但不同于支持的语法是依赖于平台的

    • Windows上 ,表达式可能只包含*? 通配符 – 看到这个答案 。

    • Unix平台的PowerShell Core中,表达式还可能包含字符集,如[0-9]

[0-9]+.jpg 不能用作-Filter值,因为它是一个正则表达式 (正则表达式)

顺便说一下:你可能打算使用. 作为一个文字 ,在这种情况下,你必须在正则表达式中将其转义\. ,因为. 是一个表示任何字符的正则表达式字符。 在输入。

因为即使通配符表达式支持[0-9]这样的字符集,也不能模拟正则表达式[0-9]+.jpg ,所以它们缺少子表达式复制符号(量词),例如+*?
(相比之下, 通配符元字符* / ?独立的构造,表示任何可能的空字符序列 / 正好一个字符 )。


注意: -WhatIf已被添加到下面的Rename-Item调用中,以预览 做出的任何更改。
删除 – 什么如果执行实际的重命名。

[ 仅在Unix上使用PowerShell Core ] 如果所有感兴趣的*.jpg文件的基名(文件名根)限制为一位 (例如1.jpg ,…, 9.jpg ),那么您可以通过传递通配符表达式 [0-9].jpg-Filter

 Get-ChildItem -File -Recurse -Filter [0-9].jpg | Rename-Item -NewName { $_.BaseName + 'a' + $_.Extension } -WhatIf 

请注意,如何将参数{ $_.BaseName + 'a' + $_.Extension }脚本块参数{ $_.BaseName + 'a' + $_.Extension } -NewName { $_.BaseName + 'a' + $_.Extension }传递给输入文件的基本名称,然后是文字a ,然后是输入文件的扩展名。


否则

  • 使用通配符表达式*.jpg进行高效的过滤

  • 然后将预过滤的结果缩小到特定的基于正则表达式的匹配, Where-Object使用-match来比较每个输入文件的基本名称与正则表达式 ^[0-9]+$ ,即测试它是否只是由十进制数字组成。

注意:
*以下命令使用PSv3 + Get-ChildItemWhere-Object语法。
传递给-match的正则表达式使用引号( '...' )而不是双引号( "..." )来确保PowerShell的字符串插值不会阻碍。

 Get-ChildItem -File -Recurse -Filter *.jpg | Where-Object BaseName -match '^[0-9]+$' | Rename-Item -NewName { $_.BaseName + 'a' + $_.Extension } -WhatIf 

GciDirls都是Get-ChildItem别名。
他们只在通配符中使用通配符而不是正则表达式。
要仅包含仅由数字组成的基名,您可以:

 Get-ChildItem -Recurse -Filter "*.jpg" | Where-Object BaseName -match "^[0-9]+$"| Rename-Item -NewName { $_.Name -replace '([0-9]+)\.jpg','$1a.jpg'} -whatif 

如果输出看起来没问题,则删除-whatif in the last line.中的-whatif in the last line.

尝试这个

 Get-ChildItem "c:\temp" -recurse -file -Filter "*.jpg" | where Basename -match "^\d$" | Rename-Item -NewName {$("{0}{1}" -f $_.basename, "a.jpg")}