【问题标题】:Enumerating MP3 files returns too many results枚举 MP3 文件返回太多结果
【发布时间】:2017-06-11 09:32:09
【问题描述】:

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

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

我有以下脚本(我意识到我可以通过管道传输结果,etc。但我正在尝试调试一些东西)。

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 - Track 1.mp3”的长度为 00:05:30
“02 - Track 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
00:05:19
00:04:31
00:04:06
00:04:59
00:04:29
00:01:04
00:04:03
00:04:55
00:04:12
00:05:05
00:08:17
00:02:59

然而,结果实际显示的是

找到 19 个文件
“01 - Track 1.mp3”的长度为 00:05:30
“02 - Track 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
00:05:19
00:04:31
00:04:06
00:04:59
00:04:29
00:01:04
00:04:03
00:04:55
00:04:12
00:05:05
00:08:17
00:02:59

两个问题:

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

【问题讨论】:

  • 您使用的是 $file.length 而不是 $files.length?
  • 天哪,愚蠢的错误。感谢您指出这一点 - 盯着它太久了。但是$trackLengths 数组中的那些数字 0-13 呢?
  • 现在只是玩弄它,这与您填充该数组的方式有关,然后还从函数返回结果,还没有完全确定。
  • 这可能是函数返回的其他东西。一个典型的 PowerShell 错误是假设 Return 语句定义了函数返回的唯一内容,但实际上任何将输出写入管道的内容也会被返回。
  • 是的,这样做:$trackLengths.Add($shellfolder.GetDetailsOf($shellfile, 27)) |外空

标签: file powershell


【解决方案1】:

您的代码有两个问题,第一个只是简单的拼写错误$file.length 而不是$files.length

第二个是这一行:

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

应该是这样的:

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

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

【讨论】:

  • 感谢您的帮助@Mark,我会一直在谷歌上搜索并盯着这个很长一段时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多