去掉 ”。”在文件名中同时保留文件扩展名
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).
装饰类型的实例
我正在尝试使用 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).