我正在编写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秒
两个问题:
$trackLengths
数组中有28个元素?答案 0 :(得分:1)
您的代码存在两个问题,第一个问题只是$file.length
而不是$files.length
的错误。
第二个是这一行:
$trackLengths.Add($shellfolder.GetDetailsOf($shellfile, 27))
需要这样:
$trackLengths.Add($shellfolder.GetDetailsOf($shellfile, 27)) | Out-Null
因为它返回了一个输出(可能是添加的数组项的索引)以及将该项添加到数组中。使用PowerShell函数时要注意Return
语句没有定义函数返回的唯一内容,也会返回写入输出的任何内容。