尝试更改命名文件的格式

Trying to change format for named files

我有一个文件夹,其中包含从我们的交换服务器中提取的 .VCF 文件。目前,它们被命名为邮箱的设置方式:Lastname, Firstname MI。我需要将它们重命名为 FirstName.LastName.

如何让 PowerShell 读取文件名,将 ", " 之前的字符存储为姓氏,然后取下一个 " " 之前剩下的字符(如果有是一个)以上面指定的格式重命名文件?

这就是发明正则表达式的目的。像这样的事情应该做你想做的事:

Get-ChildItem 'C:\temp\a\*.vcf' | % {
  $newname = $_.Name -replace '^(.*?), (.*?)(?: .*)?(\.vcf)', '.'
  Rename-Item -Path $_.FullName -NewName $newname
}

正则表达式分解:

  • ^(.*?), 匹配字符串开头 (^) 和逗号之间的任何字符 (.) 的最短序列。括号将实际匹配 (.*?) 分组,因此可以在替换字符串(捕获组)中引用它。
  • , (.*?) 匹配逗号和 space 之后但下一个表达式之前的任何字符 (.) 的最短序列。同样,匹配被分组,因此可以在替换中引用它。
  • (?: .*)? 匹配 space 后跟任意数量的字符。尾随 ? 使此匹配可选(可以出现零次或一次)。 (?:) 是一个非捕获组(与从上方捕获组相反)。这是为了允许在不污染引用列表的情况下对您不想引用的(子)表达式进行分组。
  • (\.vcf) 匹配文件扩展名(文字点后跟字符串 vcf),同样在捕获组中。考虑一下,我应该添加一个尾随 $ ((\.vcf)$) 来将该子表达式锚定在字符串的末尾。
  • 替换字符串 . 然后组合三个组,通过交换第一个和第二个引用的顺序来颠倒名字和姓氏的顺序。