【问题标题】:Windows PowerShell Batch File RenameWindows PowerShell 批处理文件重命名
【发布时间】:2015-01-09 01:11:39
【问题描述】:

目前,我手动浏览每个文件并使用通用重命名过程对其进行更新。
我刚刚开始尝试弄清楚如何使用 Windows PowerShell 来重命名具有通用结构的一堆文件。问题是,我见过的所有示例都使用通用扩展名来替换某些内容。我想在扩展后删除所有内容,但出现错误。

例子:

64244350.NSFM3V@.NO_BATCHES.20150108073838322
64244882.NSFM3V@.NO_BATCHES.20150108073534804

我希望它最终是这样的:

64244350.NSFM3V
64244882.NSFM3V

.NSFM3V 是所有文件的共同因素,但前后有随机性。这是我第一次尝试在 PowerShell 中创建东西:

Get-ChildItem *.NSFM3V* | Rename-Item -NewName {$_name -Replace *.{$_name}.*,""}

我的 Get-ChildItem .NSFM3V 可以从文件夹中抓取所有文件,但我无法对其进行重命名。

感谢您的宝贵时间!

【问题讨论】:

    标签: windows powershell batch-file optimization


    【解决方案1】:

    你可以这样做:

    gci *.NSFM3V* | rename-item -newname { $_.name -replace '(.*)@.*', '$1' }
    

    使用正则表达式获取@ 的左侧并将其用于替换。

    说明:

    • 来自gci 的任何匹配都被传递到管道,传递的对象被赋予特殊变量$_
    • Rename-Item 从管道中获取对象 $_ 并使用 {..} 内部的替换来制作新名称
    • -replace 内的正则表达式采用对象的 name 属性并应用替换
    • (.*) 表示匹配任何东西。注意括号,它们很重要,因为它们构成了一个捕获组
    • @.* 表示匹配 @ 后跟 anything
    • 这意味着当合并时,捕获任何内容,直到 @ 后跟任何内容
    • '$1' 是对捕获组的引用,因此基本上您将整个 $_.name 值替换为(最后一个)@ 之前的所有值,并将其传递给 -NewName 参数

    【讨论】:

    • 这很好用!谢谢!你介意解释一下吗?如果我需要为其他文件调整它,我想了解。 $_.name 采用当前的 GetChildItem 对吗?然后使用之后的命令替换文本?不知道如何解释下一部分 '(.*)@.*', '$1' }
    • 太棒了。如果您觉得有用,请采纳答案。
    • 想知道您是否可以重新检查我的评论并在有机会时提供一些见解?谢谢!
    • 我希望我有更多的代表,这样我就可以给你一些机会!谢谢,很有帮助
    【解决方案2】:

    一种简单的替代方法,不使用通常难以阅读/理解的正则表达式方法。

    Get-ChildItem *.NSFM3V* | Rename-Item -NewName {($_.Name -split "@")[0]}
    

    干杯, GJ

    【讨论】:

    • 您能解释一下 {($_.Name -split "@")[0]} 部分的工作原理吗?
    • 我们使用-split来分割$_.name对象,分隔符为@。所以你的文件名现在分成64244882.NSFM3V.NO_BATCHES.20150108073534804 两部分。因为我们只对第一部分感兴趣,所以我们使用数组索引,它是 [0](在 PS 索引中总是从 0 开始)。希望这可以帮助。您可以在 powershell 帮助help about_split 中阅读有关拆分技术的更多信息