4

我正在尝试在 powershell 中编写一个脚本来删除文件夹中每个 MP3 文件名的前 20 个字符,我创建了一个文件“test.ps”并将下面的 powershell 代码插入其中,

gci *.mp3 | rename-item -newname { [string]($_.name).substring(20) }

当我在 powershell.exe 中运行此文件时,没有任何反应,

任何人都可以帮忙吗?谢谢。

4

4 回答 4

6

这可能会让你开始。(可能有更简洁的方法,但是当您以后需要维护它时,这是可行的并且是可读的。:-))

我创建了一个文件夹C:\TempFiles,并在该文件夹中创建了以下文件:

TestFile1.txt
TestFile2.txt
TestFile3.txt
TestFile4.txt

(恐怕我是用老式的方式创建它们的。<g>。我用过

for /l %i in (1,1,4) do echo "Testing" > TestFile%i.txt

从实际的命令提示符。)

然后我从开始菜单打开PowerShell ISE,运行这个脚本。它创建一个数组 ( $files),只包含文件的名称,并处理每个文件:

cd \TempFiles
$files = gci -name *.txt
foreach ($file in $files) {
  $thename = $file.substring(4);
  rename-item -path c:\TempFiles\$file -newname $thename
}

这留下了包含以下内容的文件夹:

File1.Txt
File2.Txt
File3.Txt
File4.Txt
File5.Txt

为了从命令行运行脚本,您需要更改一些默认的 Windows 安全设置。您可以通过使用PowerShell ISE的帮助文件(从菜单中)并搜索或从提示中about_scripts执行来了解它们。请参阅帮助文件中的小节(它更容易阅读)。help about_scriptsISEHow To Run A Script

于 2012-05-25T23:43:05.470 回答
2

您的代码确实有效。两件事情...

  1. 将文件重命名为test.ps1.
  2. 在您保存 MP3 文件的文件夹中运行它。由于您没有提供路径,Get-ChildItem它将在当前目录中运行。

我通过制作一堆这样的 mp3 文件来测试你的产品线 -

1..30 | % { new-item -itemtype file -Name (
    $_.ToString().PadLeft(30, 'A') + ".mp3" )}
于 2012-05-25T23:48:11.250 回答
0

我会使用更“更安全”的方式(如果文件名短于所讨论的长度,则会出现错误,您还将文件扩展名作为总字符的一部分)。检查每个文件的基本名称是否大于 21 个字符(如果删除前 20 个字符,名称仍然可以是一个字符长)。如果删除前 20 个后目录包含同名文件,则可能会失败,您可以自行进一步开发):

gci *.mp3 | foreach{

    if($_.BaseName.Length -ge 21)
    {
        $ext = $_.Extension
        $BaseName = $_.BaseName.Substring(20)
        Rename-Item $_ -NewName "$BaseName$ext"
    }
}
于 2012-05-26T08:48:35.257 回答
0

// 删除(替换为空字符)所有以“dbo”开头的文件名中的前 20 个字符。// 电源外壳

Get-ChildItem C:\my_dir\dbo -Recurse -Force -Filter dbo.* | Where-Object {!$_.PSIsContainer} | Rename-Item -NewName { ($_.name).Substring(20) }
于 2018-04-19T12:20:21.067 回答