枚举MP3文件会返回太多结果

时间:2017-06-11 09:32:09

标签: file powershell

我正在编写PowerShell脚本来枚举指定目录中音乐文件的曲目长度。

测试目录只包含14个MP3文件,没有子目录,也没有隐藏文件。

我有以下脚本(我意识到我可以管道结果,。但是我试图调试一些东西)。

function Get-TrackLengths($dir) {

    $resolvedPath = (resolve-path $dir)
    $trackLengths = [System.Collections.ArrayList]@()

    $files = Get-ChildItem $dir\* -Include *.mp3,*.flac -File -Recurse False

    Write-Host (-join("found ", $file.Length, " files"))

    foreach($file in $files) {

        $path = $file.FullName
        $shell = New-Object -COMObject Shell.Application
        $folder = Split-Path $path
        $file = Split-Path $path -Leaf
        $shellfolder = $shell.Namespace($folder)
        $shellfile = $shellfolder.ParseName($file)

        Write-Host (-join("`"", $file, "`"", " has length ", $shellfolder.GetDetailsOf($shellfile, 27)))
        $trackLengths.Add($shellfolder.GetDetailsOf($shellfile, 27))
    }

    return $trackLengths
}

$trackLengths = Get-TrackLengths "[fully-qualified directory path]"

Write-Host (-join($trackLengths.Length, " Track lengths:"))

foreach($trackLength in $trackLengths) {
    Write-Host $trackLength
}

鉴于测试目录的14个MP3文件,我希望看到以下结果。

  

找到14个文件
  " 01 - 跟踪1.mp3"长度00:05:30
  " 02 - 跟踪2.mp3"长度为00:00:45
  " 03 - Track 3.mp3"长度00:05:19
  " 04 - Track 4.mp3"长度为00:04:31
  " 05 - Track 5.mp3"长度为00:04:06
  " 06 - Track 6.mp3"长度为00:04:59
  " 07 - Track 7.mp3"长度00:04:29
  " 08 - Track 8.mp3"长度为00:01:04
  " 09 - Track 9.mp3"长度00:04:03
  " 10 - Track 10.mp3"长度为00:04:55
  " 11 - Track 11.mp3"长度为00:04:12
  " 12 - Track 12.mp3"长度为00:05:05
  " 13 - Track 13.mp3"长度为00:08:17
  " 14 - Track 14.mp3"长度00:02:59
  14轨道长度:
  00:05:30
  00:00:45
  0时05分19秒
  0时04分31秒
  0时04分06秒
  0时04分59秒
  0时04分29秒
  0时01分04秒
  0时04分03秒
  0时04分55秒
  0时04分12秒
  0时05分05秒
  0点08分17秒
  0时02分59秒

然而,实际显示的结果是

  

找到 19 个文件
  " 01 - 跟踪1.mp3"长度00:05:30
  " 02 - 跟踪2.mp3"长度为00:00:45
  " 03 - Track 3.mp3"长度00:05:19
  " 04 - Track 4.mp3"长度为00:04:31
  " 05 - Track 5.mp3"长度为00:04:06
  " 06 - Track 6.mp3"长度为00:04:59
  " 07 - Track 7.mp3"长度00:04:29
  " 08 - Track 8.mp3"长度为00:01:04
  " 09 - Track 9.mp3"长度00:04:03
  " 10 - Track 10.mp3"长度为00:04:55
  " 11 - Track 11.mp3"长度为00:04:12
  " 12 - Track 12.mp3"长度为00:05:05
  " 13 - Track 13.mp3"长度为00:08:17
  " 14 - Track 14.mp3"长度00:02:59
  28轨道长度:
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10个
  11个
  12个
  13个
  00:05:30
  00:00:45
  0时05分19秒
  0时04分31秒
  0时04分06秒
  0时04分59秒
  0时04分29秒
  0时01分04秒
  0时04分03秒
  0时04分55秒
  0时04分12秒
  0时05分05秒
  0点08分17秒
  0时02分59秒

两个问题:

  1. 为什么说它找到了19个文件 - 特别是当它只列出14个文件时?
  2. 列出曲目长度时,为什么首先写出0-13,说$trackLengths数组中有28个元素?

1 个答案:

答案 0 :(得分:1)

您的代码存在两个问题,第一个问题只是$file.length而不是$files.length的错误。

第二个是这一行:

$trackLengths.Add($shellfolder.GetDetailsOf($shellfile, 27))

需要这样:

$trackLengths.Add($shellfolder.GetDetailsOf($shellfile, 27)) | Out-Null

因为它返回了一个输出(可能是添加的数组项的索引)以及将该项添加到数组中。使用PowerShell函数时要注意Return语句没有定义函数返回的唯一内容,也会返回写入输出的任何内容。