【问题标题】:Rename first 20 characters of every filename in a file重命名文件中每个文件名的前 20 个字符
【发布时间】:2012-06-01 11:47:15
【问题描述】:

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

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

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

有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: powershell windows-7


    【解决方案1】:

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

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

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

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

    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 或通过在ISE 提示符下执行help about_scripts 来了解它们。请参阅帮助文件中的 How To Run A Script 小节(更容易阅读)。

    【讨论】:

    • 谢谢肯,我现在已经开始工作了!我在 powershell ISE 中运行脚本,而不是创建 ps1 文件。虽然我刚刚遇到了另一个问题,但它只适用于名称中没有空格的文件。例如文件“song.mp3”可以工作,但文件名“this song.mp3”会抛出一个错误,说找不到文件。有解决办法吗?提前致谢。
    • 我不知道,恐怕。我刚刚通过“New Test 25.txt”将文件添加到名为“New Test 21.txt”的文件夹中,并在 PS ISE 中运行了相同的脚本,它在这里运行良好,留下文件“Test 21.txt”到“Test 25” .txt"。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我不明白。我已将其保存到 ps1 文件中,并通过更改到 ps1 文件所在的目录并插入命令“.\test.ps1”来执行我的代码,将其加载到 powershell 中。执行此操作时我没有收到任何错误,但没有任何反应。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        • 2020-11-26
        • 2013-10-08
        • 2018-05-02
        相关资源
        最近更新 更多