去掉 ”。”在文件名中同时保留文件扩展名

Remove "." in file name while retaining file extension

我正在尝试使用 PS 重命名一个大共享中的一堆文件,其中一个要求是从文件名中删除一个点。我已经用我相当基本的技能测试了一些东西,当然还有最基本的脚本 zap 文件扩展名。
我终于想到了这样的事情:

gci *.xlsx | rename-item -newname {$_.Name.replace(".","") + $_.extension }

但这会将扩展名添加到文件名的末尾(同时保持文件扩展名不变)

我想我可以使用类似这样的方法来删除最后四个符号:

gci *.xlsx | rename-item -newname { $_.basename.substring(0,$_.basename.length-4) + $_.extension }

总的来说,这似乎是一个过于复杂的操作,它也可能会弄乱没有点的文件(除非我将 xlsx 指定为只删除 4 个符号)

谁能为我指明正确的方向以找到更简单的解决方案? ;-)

您第二次尝试的方向是正确的:使用 [System.IO.FileInfo] instances[1] output by Get-ChildItem.BaseName.Extension 属性允许您修改基本名称(文件名 不带扩展名),然后re-append扩展名组成完整的文件名:

Get-ChildItem *.xlsx | 
  Rename-Item -NewName { ($_.BaseName -replace '\.') + $_.Extension } -WhatIf

注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf

上面使用 regex-based -replace 运算符 从基本名称中删除所有 . 实例;因为 . 是一个正则表达式 元字符(代表任何单个字符),它必须 escaped\. 以便按字面意思使用。
在这个简单的例子中,您也可以使用 [string] 类型的 .Replace() 方法 ($_.BaseName.Replace('.', '')),但是 -replace 提供更多功能和惊喜较少 - 请参阅 了解更多信息。

举个例子:假设您只想从基本名称中删除 first .-replace 允许您按如下方式执行此操作(但您不能使用 .Replace() 执行此操作):

'foo.bar.baz' -replace '\.(.*)$', '' # -> 'foobar.baz'

[1] .BaseName 不是这种类型的原生 属性;相反,它是 属性,PowerShell 使用其 ETS (Extended Type System).

装饰类型的实例