【发布时间】: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
两个问题:
- 为什么它说它找到了 19 个文件 - 特别是当它只列出 14 个文件时?
- 列出磁道长度时,为什么先写出0-13,说
$trackLengths数组有28个元素?
【问题讨论】:
-
您使用的是 $file.length 而不是 $files.length?
-
天哪,愚蠢的错误。感谢您指出这一点 - 盯着它太久了。但是
$trackLengths数组中的那些数字 0-13 呢? -
现在只是玩弄它,这与您填充该数组的方式有关,然后还从函数返回结果,还没有完全确定。
-
这可能是函数返回的其他东西。一个典型的 PowerShell 错误是假设 Return 语句定义了函数返回的唯一内容,但实际上任何将输出写入管道的内容也会被返回。
-
是的,这样做:$trackLengths.Add($shellfolder.GetDetailsOf($shellfile, 27)) |外空
标签: file powershell