Примените рекурсивный запуск к $com.GetDetailsOf, чтобы получить параметр длины

#powershell

#powershell

Вопрос:

Я пытаюсь запустить скрипт power-shell, чтобы получить атрибут длины (длительности) файлов .wav, сохраненных в папке.

Хотя я могу выполнить приведенный ниже скрипт для получения атрибутов, я не могу выполнить рекурсивный запуск, то есть просмотреть .wav во вложенных папках.

Не мог бы кто-нибудь предложить необходимые обновления?

 $folder= 'C:folder'

$com = (New-Object -ComObject Shell.Application).NameSpace($folder)
for($i = 0; $i -lt 64; $i  ){
    $name = $com.GetDetailsOf($com.Items, $i)
    if ($name -eq 'Length') { $lengthattribute = $i}
}
$com.Items() |
    ForEach-Object{
        [PSCustomObject] @{
            Name = $_.Name
            Path = $_.Path
            Size = $com.GetDetailsOf($_, 1)
            DateCreated = $com.GetDetailsOf($_, 4)
            Length = $com.GetDetailsOf($_, $lengthattribute)
            
        }
} | Export-Csv -Path $folderlength.csv -Encoding ascii -NoTypeInformation
 

Ответ №1:

Это займет указанную папку плюс рекурсивный список каждой вложенной папки и извлечет информацию только о файлах wav.

 $folder= 'C:folder'

$shell = New-Object -ComObject Shell.Application

@(Get-Item $folder)   @(Get-ChildItem -Path $folder -Directory -Recurse) | ForEach-Object {
    $com = $shell.NameSpace($_.FullName)

    foreach($item in $com.Items() | Where-Object type -eq "WAV File")
    {
        [PSCustomObject] @{
            Name        = $item.Name
            Path        = $item.Path
            Size        = $com.GetDetailsOf($item, 1)
            DateCreated = $com.GetDetailsOf($item, 4)
            Length      = $com.GetDetailsOf($item, 27)
        
        }
    }
}
 

Редактировать

В случае, если файлы называются .wav, но не являются фактическими файлами wav, любая из этих альтернатив должна работать.

 $folder= 'C:folder'

$shell = New-Object -ComObject Shell.Application

@(Get-Item $folder)   @(Get-ChildItem -Path $folder -Directory -Recurse) | ForEach-Object {
    $com = $shell.NameSpace($_.FullName)

    foreach($item in $com.Items() | Where-Object name -match '.wav')
    {
        [PSCustomObject] @{
            Name        = $item.Name
            Path        = $item.Path
            Size        = $com.GetDetailsOf($item, 1)
            DateCreated = $com.GetDetailsOf($item, 4)
            Length      = $com.GetDetailsOf($item, 27)
    
        }
    }
}
 

или

 $folder= 'C:folder'

$shell = New-Object -ComObject Shell.Application

@(Get-Item $folder)   @(Get-ChildItem -Path $folder -Directory -Recurse) | ForEach-Object {
    $com = $shell.NameSpace($_.FullName)

    foreach($item in $com.Items() | Where-Object name -like '*.wav')
    {
        [PSCustomObject] @{
            Name        = $item.Name
            Path        = $item.Path
            Size        = $com.GetDetailsOf($item, 1)
            DateCreated = $com.GetDetailsOf($item, 4)
            Length      = $com.GetDetailsOf($item, 27)
    
        }
    }
}
 

Комментарии:

1. Спасибо, Даг. Кажется, я не могу получить какой-либо вывод из вашего скрипта.

2. Тогда, возможно, они на самом деле не являются файлами wav.

Ответ №2:

модифицировал предложенный вами код таким образом — и он работает!

 $folder= "C:folder"

$shell = New-Object -ComObject Shell.Application

@(Get-Item $folder)   @(Get-ChildItem -Path $folder -Directory -Recurse) | ForEach-Object {
    $com = $shell.NameSpace($_.FullName)

    foreach($item in $com.Items() | Where-Object **{ $_.Name -like "*.wav" }**)
    {
        [PSCustomObject] @{
            Name        = $item.Name
            Path        = $item.Path
            Size        = $com.GetDetailsOf($item, 1)
            DateCreated = $com.GetDetailsOf($item, 4)
            Length      = $com.GetDetailsOf($item, 27)
        
        }
    }
}** 
 

Комментарии:

1. Я обновил свой ответ. Пожалуйста, удалите этот дубликат.