尝试更改命名文件的格式

时间:2015-01-21 17:49:48

标签: powershell file-rename

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

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

1 个答案:

答案 0 :(得分:1)

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

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

正则表达式细分:

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