如何使用 powershell 根据包含的文件数量过滤目录
How do I filter directories with powershell on the amount of files contained
我在寻找正确的语法时遇到问题我需要在文件数超过指定数量(在我的例子中为 600)的列表目录上过滤我的结果。
到目前为止,这是我的代码;
$server_dir= "D:\backup"
$export_dir= "C:\support\spcount.txt"
if($server_dir)
{
$folders = Get-ChildItem $server_dir
$output = @()
foreach($folder in $folders)
{
$fname = $folder.Name
$fpath = $folder.FullName
$fcount = Get-ChildItem $fpath | Measure-Object | Select-Object -Expand Count
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount} | Format-List;
$output += $obj
}
#Output
$output | Tee-Object -FilePath $export_dir | Format-list FileCount
}
我得到了积极的结果,它列出了备份目录中的所有子项,但是如果目录包含 600 个或更多文件,我需要过滤它以仅显示和输出文本格式。
有人可以帮我吗?
我也是 powershell 新手,所以如果这段代码不是最好的请拉我上来,我也一直想学习。
谢谢!
简而言之,您可以执行类似的操作来获取该信息。
Get-ChildItem C:\temp -Directory |
Select Name,@{Label="Count";Expression={(Get-Childitem $_ -file -Recurse).Count}} |
Where-Object{$_.Count -lt 10}
看看我们是否可以将其合并到您的代码中。您的 if
声明也毫无意义。您的变量包含一个非空 \ 非零长度字符串,因此它将 always 为 True。如果我想目录存在,你希望它工作。
$server_dir= "D:\backup"
$export_dir= "C:\support\spcount.txt"
if(Test-Path $server_dir){
Get-ChildItem C:\temp -Directory |
Select Name,@{Label="Count";Expression={(Get-Childitem $_ -file -Recurse).Count}} |
Where-Object{$_.Count -lt 10} |
ConvertTo-Csv | Tee -File $export_dir | ConvertFrom-Csv
} Else {
Write-Warning "$server_dir does not exist."
}
请稍候,Tee
正在努力将其归档和筛选。
我看到有两种方法可以做到这一点。
像这样在你的输出中过滤它:
$output | where -property FileCount -gt 599 | # ... your code to write to the output
或者如果不符合条件则不存储到输出数组中:
if ($fcount -gt 599) {
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount} | Format-List;
$output += obj
}
我想我找到了问题所在。这是对象创建语句末尾的 Format-List
语句。它通过 Format-List
传输新创建的对象,从而将其转换为其他对象。
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount} | Format-List
因此,如果您删除最后一点,您将得到您期望的对象
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount}
因此,当您使用 where
语句进行过滤时,您实际上会有一个 FileCount 属性 来进行过滤。
我通过 运行 通过 Get-Member
的 $output 检测到它,这表明它不是具有预期属性的对象。
基本上,这是您的代码,包括修复:
if($server_dir)
{
# *** Added the -directory flag, cause we don't need those pesky files ***
$folders = Get-ChildItem $server_dir -directory
$output = @()
foreach($folder in $folders)
{
$fname = $folder.Name
$fpath = $folder.FullName
$fcount = Get-ChildItem $fpath | Measure-Object | Select-Object -Expand Count
# *** Format-List was dropped here to avoid losing the objects ***
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount}
$output += $obj
}
# *** And now the filter and we're done ***
$output | where -Property FileCount -ge 600 | Tee-Object -FilePath $export_dir | Format-list FileCount
}
另请注意 -directory
仅获取带有 get-childitem
的文件夹,以及 -ge 600
(g大于或 equal) 而不是 -gt 599
只是更明显一点。
请记住,Format-* 语句实际上会转换通过它们传递的数据。因此,您应该只使用管道末端的那些在屏幕上显示数据或将其转储到文件中。
不要使用它来转换您以后仍要使用的数据。
我在寻找正确的语法时遇到问题我需要在文件数超过指定数量(在我的例子中为 600)的列表目录上过滤我的结果。
到目前为止,这是我的代码;
$server_dir= "D:\backup"
$export_dir= "C:\support\spcount.txt"
if($server_dir)
{
$folders = Get-ChildItem $server_dir
$output = @()
foreach($folder in $folders)
{
$fname = $folder.Name
$fpath = $folder.FullName
$fcount = Get-ChildItem $fpath | Measure-Object | Select-Object -Expand Count
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount} | Format-List;
$output += $obj
}
#Output
$output | Tee-Object -FilePath $export_dir | Format-list FileCount
}
我得到了积极的结果,它列出了备份目录中的所有子项,但是如果目录包含 600 个或更多文件,我需要过滤它以仅显示和输出文本格式。
有人可以帮我吗?
我也是 powershell 新手,所以如果这段代码不是最好的请拉我上来,我也一直想学习。
谢谢!
简而言之,您可以执行类似的操作来获取该信息。
Get-ChildItem C:\temp -Directory |
Select Name,@{Label="Count";Expression={(Get-Childitem $_ -file -Recurse).Count}} |
Where-Object{$_.Count -lt 10}
看看我们是否可以将其合并到您的代码中。您的 if
声明也毫无意义。您的变量包含一个非空 \ 非零长度字符串,因此它将 always 为 True。如果我想目录存在,你希望它工作。
$server_dir= "D:\backup"
$export_dir= "C:\support\spcount.txt"
if(Test-Path $server_dir){
Get-ChildItem C:\temp -Directory |
Select Name,@{Label="Count";Expression={(Get-Childitem $_ -file -Recurse).Count}} |
Where-Object{$_.Count -lt 10} |
ConvertTo-Csv | Tee -File $export_dir | ConvertFrom-Csv
} Else {
Write-Warning "$server_dir does not exist."
}
请稍候,Tee
正在努力将其归档和筛选。
我看到有两种方法可以做到这一点。
像这样在你的输出中过滤它:
$output | where -property FileCount -gt 599 | # ... your code to write to the output
或者如果不符合条件则不存储到输出数组中:
if ($fcount -gt 599) {
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount} | Format-List;
$output += obj
}
我想我找到了问题所在。这是对象创建语句末尾的 Format-List
语句。它通过 Format-List
传输新创建的对象,从而将其转换为其他对象。
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount} | Format-List
因此,如果您删除最后一点,您将得到您期望的对象
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount}
因此,当您使用 where
语句进行过滤时,您实际上会有一个 FileCount 属性 来进行过滤。
我通过 运行 通过 Get-Member
的 $output 检测到它,这表明它不是具有预期属性的对象。
基本上,这是您的代码,包括修复:
if($server_dir)
{
# *** Added the -directory flag, cause we don't need those pesky files ***
$folders = Get-ChildItem $server_dir -directory
$output = @()
foreach($folder in $folders)
{
$fname = $folder.Name
$fpath = $folder.FullName
$fcount = Get-ChildItem $fpath | Measure-Object | Select-Object -Expand Count
# *** Format-List was dropped here to avoid losing the objects ***
$obj = New-Object psobject -Property @{FolderName = $fname; FileCount = $fcount}
$output += $obj
}
# *** And now the filter and we're done ***
$output | where -Property FileCount -ge 600 | Tee-Object -FilePath $export_dir | Format-list FileCount
}
另请注意 -directory
仅获取带有 get-childitem
的文件夹,以及 -ge 600
(g大于或 equal) 而不是 -gt 599
只是更明显一点。
请记住,Format-* 语句实际上会转换通过它们传递的数据。因此,您应该只使用管道末端的那些在屏幕上显示数据或将其转储到文件中。 不要使用它来转换您以后仍要使用的数据。