power shell脚本从每个子文件夹中获取数据

时间:2018-02-13 04:49:47

标签: powershell

enter image description here我在这个文件夹中有一个文件夹我有大约20个子文件夹,每个子文件夹都有.wav文件,我有一个使用这个脚本的电源shell脚本我可以从一个文件夹中获取数据,但是当我点击主文件夹时,我希望一次性获取所有子文件夹中的数据。下面是我的power shell脚本。请帮我修改我的脚本。

# Show an Open Folder Dialog and return the directory selected by the user.
function Read-FolderBrowserDialog([string]$Message, [string]$InitialDirectory, [switch]$NoNewFolderButton)
{
    $browseForFolderOptions = 0
    if ($NoNewFolderButton) { $browseForFolderOptions += 512 }

    $app = New-Object -ComObject Shell.Application
    $folder = $app.BrowseForFolder(0, $Message, $browseForFolderOptions, $InitialDirectory)
    if ($folder) { $selectedDirectory = $folder.Self.Path } else { $selectedDirectory = '' }
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($app) > $null
    return $selectedDirectory
}
$folder= Read-FolderBrowserDialog
$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 report.csv -notypeinformation

3 个答案:

答案 0 :(得分:2)

使用Com-objects进行文件夹操作不再是PowerShell方式,我通常不喜欢将UI控件与脚本混合,除非那些是控制器。

一旦你知道$folder作为父级,我会过滤子目录然后foreach subdir我会递归测量其中的文件,丰富原始对象并选择相关的属性。类似的东西:

$folder | Get-ChildItem -Directory | ForEach-Object {
    $files = ($_ | Get-ChildItem -Recurse | Measure-Object -Sum Length);
    $_ |
    Add-Member -NotePropertyName FileCount -NotePropertyValue $files.Count -PassThru |
    Add-Member -NotePropertyName Length -NotePropertyValue $files.Sum -PassThru
} |
Select Name,FileCount,Length,LastWriteTime

所以你会得到一个结果:

Name           FileCount   Length LastWriteTime
----           ---------   ------ -------------
subfolder_A          499   679695 2/02/2017 12:23:21 PM
subfolder_B           35    21033 12/01/2017 1:36:53 PM
subfolder_C           18    10777 12/01/2017 1:38:28 PM
...

答案 1 :(得分:0)

您的问题已经得到解答。但是如果你想尝试按照你的方法进行尝试,那么你可以使用Type Marshal对象的$com.Items()方法。一种方法是检查某个商品是否属于type File Folder。如果是,则可以使用-Recurse参数和Get-ChildItem cmdlet列出文件夹中的所有子文件夹和文件。您的代码看起来像这样

# Show an Open Folder Dialog and return the directory selected by the user.
function Read-FolderBrowserDialog([string]$Message, [string]$InitialDirectory, [switch]$NoNewFolderButton)
{
    $browseForFolderOptions = 0
    if ($NoNewFolderButton) { $browseForFolderOptions += 512 }

    $app = New-Object -ComObject Shell.Application
    $folder = $app.BrowseForFolder(0, $Message, $browseForFolderOptions, $InitialDirectory)
    if ($folder) { $selectedDirectory = $folder.Self.Path } else { $selectedDirectory = '' }
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($app) > $null
    return $selectedDirectory
}
$folder= Read-FolderBrowserDialog
$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 {
    if ($_.Type -ne "File Folder")
    {
        [PSCustomObject]@{
        Name = $_.Name
        Size = $com.GetDetailsOf($_, 1)
        DateCreated = $com.GetDetailsOf($_, 4)
        Length = $com.GetDetailsOf($_, $lengthattribute)}
    } 
} | Export-csv report.csv  -Encoding ascii -NoTypeInformation

$com.Items() | ForEach-Object {
    If ($_.Type -eq "File Folder")
    {
        Get-ChildItem -path $Folder -Recurse | ForEach-Object {
        [PSCustomObject]@{
        Name = $_.Name
        Size = $_.Length/1KB
        DateCreated = $_.CreationTime }
        }
    }
}  | Export-csv report.csv -Encoding ascii -NoTypeInformation -Append -Force

我使用-append-force参数在一个CSV中输出所有内容。 上面的脚本将列出文件夹的子文件夹以及子文件夹的子文件夹中的文件。此外,它将列出根目录中的文件夹。我想这就是你要找的东西。无论如何,您可以根据您的要求添加更多条件,这就是为什么我将Foreach-Object分成条件数(在这种情况下为2,一个)而不是单一Foreach-Object用于文件夹,另一个用于子文件夹中的文件)。您可以根据您的要求调整此脚本。

答案 2 :(得分:-1)

实际上,如果您只是获取路径的子项,然后检查该路径的子项,那么整个过程可以更轻松地完成。所以,这样做,享受生活中光明的一面。

$folder = Get-Childitem 'C:\'

Get-Childitem $folder

如果您想使用Output,只需将Get-Childitem $文件夹放入另一个变量中,就像这样。

$folder2 = Get-Childitem $folder

我希望我能帮助你解决这个好友;)。