作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的文件夹/子文件夹中有多个.txt文件。
我想在他们的文件名后面加上_old。
我试过了:
Get-ChildItem -Recurse | Rename-Item -NewName {$_.name -replace '.txt','_old.txt' }
.._old_old.txt
Rename-Item : Source and destination path must be different.
最佳答案
为了防止已经重命名的文件意外地重新输入文件枚举并因此被多次重命名,将您的Get-ChildItem
调用括在()
,grouping operator中,确保在将结果发送到 [1]之前首先收集所有输出。管道:
(Get-ChildItem -Recurse) |
Rename-Item -NewName { $_.name -replace '\.txt$', '_old.txt' }
\.txt$
作为regex [2],以确保仅匹配文件名末尾的文字
.
(
\.
)和字符串
txt
(
$
),以防止误报(例如,名为
Atxt.csv
的文件,甚至是名为
AtxtB
的目录都将意外地与您的原始正则表达式匹配)。
Get-ChildItem
输出的需求来自PowerShell管道的基本工作原理:(默认情况下)将对象逐个发送到管道,并在接收对象时通过接收命令对其进行处理。这意味着,在
(...)
周围没有
Get-ChildItem
的情况下,
Rename-Item
在
Get-ChildItem
完成枚举文件之前开始重命名文件,这会引起问题。有关PowerShell管道如何工作的更多信息,请参见
this answer。
(Get-ChildItem -Recurse -File -Filter *.txt) |
Rename-Item -NewName { $_.BaseName + '_old' + $_.Extension }
-File
将输出限制为文件(也不返回目录)。 -Filter
是将结果限制为给定通配符模式的最快方法。 $_.BaseName + '_old' + $_.Extension
通过文件名的子组件使用简单的字符串连接。-replace
:$_.Name -replace '\.[^.]+$', '_old$&'
-Exclude *_old.txt
调用中添加
Get-ChildItem
。
Get-ChildItem
的方式发生了变化(现在它在内部对结果进行排序,因此始终需要首先收集所有结果),因此不再严格要求
(...)
shell ,但这可以考虑实现细节,因此为了概念清晰起见,最好继续使用
(...)
。
-replace
operator在正则表达式(正则表达式)上运行;它不会像
[string]
类型的
.Replace()
方法那样执行文字子字符串搜索。
关于powershell - 如何在Powershell中递归附加到文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60302579/
我是一名优秀的程序员,十分优秀!