我在这个文件夹中有一个文件夹我有大约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
答案 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
我希望我能帮助你解决这个好友;)。