gpt4 book ai didi

powershell - 如何在Powershell中递归附加到文件名?

转载 作者:行者123 更新时间:2023-12-03 00:57:55 26 4
gpt4 key购买 nike

我的文件夹/子文件夹中有多个.txt文件。

我想在他们的文件名后面加上_old。

我试过了:

Get-ChildItem -Recurse | Rename-Item -NewName {$_.name -replace '.txt','_old.txt' }

结果是:
  • 某些文件已正确更新
  • 有些文件更新不正确-他们两次被_old损坏-例如:.._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-ItemGet-ChildItem完成枚举文件之前开始重命名文件,这会引起问题。有关PowerShell管道如何工作的更多信息,请参见 this answer
    Matthew的提示,建议包含此信息。

    但是,我建议按以下方式优化命令:
    (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

    [1]由于在PowerShell [Core] 6+中实现了 Get-ChildItem的方式发生了变化(现在它在内部对结果进行排序,因此始终需要首先收集所有结果),因此不再严格要求 (...) shell ,但这可以考虑实现细节,因此为了概念清晰起见,最好继续使用 (...)

    [2] PowerShell的 -replace operator在正则表达式(正则表达式)上运行;它不会像 [string]类型的 .Replace()方法那样执行文字子字符串搜索。

    关于powershell - 如何在Powershell中递归附加到文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60302579/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com