我有一系列以以下方式命名的文件夹:
11.23 John Smith
12.912 Kate Spade
23.34 Alexander McQueen
22.E01 Michael Kors
我想将文件夹名称重命名为:
11.23
12.912
23.34
22.E01
唯一的一致性是数字和人名之间始终有一个空格。
我尝试使用下面这段代码但它删除了前缀而不是后缀:
Get-ChildItem | foreach {Rename-Item $_ $_.Name.Replace("Prefix", "")}
答案1
你可以使用这个:
Get-ChildItem -Directory | % { Rename-Item $_.FullName ($_.Name -replace '^(\S+) .*', '$1')}
分解:
Get-ChildItem -Directory
- 获取子目录| % {}
- 将它们通过管道传输到Foreach-Object
(%
)Rename-Item $_.FullName ($_.Name -replace '^(\S+) .*', '$1')
- 根据全名(更安全)重命名为使用正则表达式替换的名称。^(\S)
匹配字符串开头(^
)中不是空格的任何内容作为一个组,后跟一个空格。.*
匹配此后的任何内容。
如果您想确保文件夹匹配,正则表达式可能会更强大。例如:
^(\d+\.[\dE]+) \w+ \w+$
它匹配第二部分可以有小数点的数字E
,后面跟着两个单词。这符合您的示例,但不确定它是否满足您需要的所有要求,因此上面的方法在工作方面更可靠。
Prefix
您的代码没有完成任何事情,它只是试图从名称中删除该词。
答案2
如果第一个字段后总有一个空格,那么你可以使用这个
Get-ChildItem -Directory | Rename-Item -NewName { ($_.Name -split " ")[0] } -WhatIf
别名版本:
ls -Di | ren -New { ($_.Name -split " ")[0] } -wi
-WhatIf
/-wi
是进行试运行,删除它才能进行真正的重命名
这比使用正则表达式简单得多。-split
运算符将名称拆分为一个数组,我们只需取第一个标记并将其用作文件夹的新名称