在PowerShell中批量重命名

时间:2017-02-05 19:00:03

标签: windows powershell batch-processing

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

media
+- random-project
|  +- 1.jpg
|  +- 2.jpg
|  +- 3.jpg
|  `- thumb.png
+- another-random-project
|  +- 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" }

但之前从未使用过该程序。你觉得怎么样?

3 个答案:

答案 0 :(得分:1)

  • 总是值得使用-Filter参数,如果可用的话:它会在源处执行过滤,因此通常比过滤< EM>后

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

    • Windows 上,表达式可能只包含*?通配符 - 请参阅this answer

    • Unix 平台上的PowerShell核心中,表达式还可能包含[0-9]等字符集。

[0-9]+.jpg 作为-Filter值工作,因为它是正则表达式(正则表达式)

暂且不说:您可能打算将.用作文字,在这种情况下,您必须转义正则表达式为\.,因为.是表示任何字符的正则表达式元字符。在输入中。

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

注意:-WhatIf已添加到预览下面的Rename-Item次调用中进行的所有更改。
删除-WhatIf以执行实际重命名 功能

[仅限Unix上的< PowerShell核心] 如果所有感兴趣的*.jpg个文件都有一个基本名称(文件名) root)仅限于一位数,(例如1.jpg,...,9.jpg),你可以通过传递< em>通配符表达式 [0-9].jpg-Filter

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

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

否则

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

  • 然后将预过滤后的结果缩小到使用Where-Object-match调用的特定正则表达式匹配将每个输入文件的基本名称与 regex ^[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

答案 1 :(得分:0)

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.

答案 2 :(得分:0)

试试这个

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