我试图更新一堆.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" }
但之前从未使用过该程序。你觉得怎么样?
答案 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-ChildItem
和Where-Object
语法
*传递给-match
的正则表达式使用单 - 引用('...'
)而不是双引号("..."
)以确保PowerShell的字符串插值不会得到在路上。
Get-ChildItem -File -Recurse -Filter *.jpg |
Where-Object BaseName -match '^[0-9]+$' |
Rename-Item -NewName { $_.BaseName + 'a' + $_.Extension } -WhatIf
答案 1 :(得分:0)
Gci
和Dir
或ls
都是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")}