我有一个包含从我们的Exchange服务器中提取的.VCF文件的文件夹。目前,它们被命名为邮箱的设置方式:Lastname, Firstname MI
。我需要将它们重命名为FirstName.LastName
。
如何让PowerShell读取文件名,将字符存储为", "
作为姓氏,然后将剩下的内容保留到下一个" "
(如果有的话) )以上面指定的格式重命名文件?
答案 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
然后组合三个组,通过切换第一个和第二个引用的顺序来反转名字和姓氏的顺序。