Windows PowerShell 批处理文件重命名

Windows PowerShell Batch File Rename

目前,我手动浏览每个文件并使用常见的重命名程序更新它。
我刚刚开始尝试弄清楚如何使用 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 可以从文件夹中抓取所有文件,但我无法重命名它。

感谢您的宝贵时间!

你可以这样做:

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

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

解释:

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

不使用正则表达式方法的简单替代方法 read/understand。

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

干杯, GJ