Powershell 命令(在批处理文件中)从文件名中删除最后 3 个字符(扩展名之前)?

Powershell 命令(在批处理文件中)从文件名中删除最后 3 个字符(扩展名之前)?

我有 mp3 文件(名称长度不同),并且想要删除批处理文件旁边的每个 mp3 文件“.mp3”之前的最后三个字符。

例如foobar043.mp3需要成为foobar.mp3

这听起来很简单,但我已经尝试了很多方法来做到这一点(使用批处理文件中的 PowerShell),并尝试仅使用批处理命令来完成 - 使用 SuperUser 上已有的答案。

我的最后一个命令最接近,但它也删除了文件扩展名。这缩短为命令本身:

gci *.mp3 | rename-item -newname { $_.name.substring(0,$_.name.length-7) }

现在,如果有某种方法可以在末尾保留“ .mp3”(或者将现在没有扩展名的文件重命名回 .mp3 而无需重命名文件夹!)它将工作正常。

人们通常会要求列出已经尝试过的方法,但这个问题最终会长十倍!这样说吧,如果你在 Google 中输入“powershell 从文件名中删除最后一个字符”,我已经尝试了迄今为止找到的所有方法。

仅举几个尝试接受(并投票)答案的例子:

(以及 spiceworks 和 reddit 上的答案,如果这里不允许的话我不会链接到它们)。

提前感谢任何知道如何做到这一点的人同时保留文件扩展名。

这是一个难题,因为通常我可以将文件名(不带扩展名)设置为变量,但由于 PowerShell 要重命名该文件,因此该变量实际上变得毫无用处。

答案1

看看这是否是你想要的:

@echo off
setlocal EnableDelayedExpansion
for %%a in (*.mp3) do (
                       set "SName=%%~na"
                       ren "%%a" "!SName:~0,-3!%%~xa"
                      )
exit

答案2

您正在删除最后 7 个字符,因此扩展名显然会被删除。您应该只替换BaseName

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

相关内容