#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. Я обновил свой ответ. Пожалуйста, удалите этот дубликат.