重命名文件中每个文件名的前20个字符

时间:2012-05-25 22:40:54

标签: powershell windows-7

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

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

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

有人可以帮忙吗?感谢。

4 个答案:

答案 0 :(得分: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_scripts提示符执行ISE来了解相关信息。请参阅帮助文件中的How To Run A Script小节(更容易阅读)。

答案 1 :(得分:2)

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

  1. 将文件重命名为test.ps1
  2. 在您拥有MP3文件的文件夹中运行它。由于您没有提供Get-ChildItem的路径,它将在当前目录中运行。
  3. 我通过制作一堆像这样的mp3文件来测试你的行 -

    1..30 | % { new-item -itemtype file -Name (
        $_.ToString().PadLeft(30, 'A') + ".mp3" )}
    

答案 2 :(得分:0)

我会使用更“安全”的方式(如果文件名比有问题的长度短,你会收到错误,你也将文件扩展名作为总字符的一部分)。检查每个文件的基本名称是否大于21个字符(如果删除前20个字符,则它仍然可以包含一个字符长的名称)。如果在删除前20个目录后包含具有相同名称的文件,则可能会失败,您可以自行开发它:)

gci *.mp3 | foreach{

    if($_.BaseName.Length -ge 21)
    {
        $ext = $_.Extension
        $BaseName = $_.BaseName.Substring(20)
        Rename-Item $_ -NewName "$BaseName$ext"
    }
}

答案 3 :(得分:0)

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

Get-ChildItem C:\my_dir\dbo -Recurse -Force -Filter dbo.* | Where-Object {!$_.PSIsContainer} | Rename-Item -NewName { ($_.name).Substring(20) }