Powershell Where-Object 排除结果
Powershell Where-Object excluding a result
我刚刚编写了一个小脚本来提供我音乐库中所有文件夹的列表,其中不包括 Artist.nfo 或 Album.nfo。
我的文件夹结构是这样的:M:\Genre\Artist\Album
Artist.nfo 应位于艺术家中,Album.nfo 应位于专辑文件夹中。
因为我正在分别搜索这两个文件,所以我现在很难在搜索结果中排除其他 .nfo。
我当前的搜索功能:
#region noArtistnfo
function noArtistnfo
{
[CmdletBinding()]
param ($path)
Get-ChildItem $path -recurse | Where-Object { $_.PSIsContainer -eq $True }`
| Where-Object { $_.GetFiles().name -notcontains "Artist.nfo"}`
| Select-Object FullName | Out-String
}
#endregion noArtistnfo
#region noAlbumnfo
function noAlbumnfo
{
[CmdletBinding()]
param ($path)
Get-ChildItem $path -recurse | Where-Object { $_.PSIsContainer -eq $True }`
| Where-Object { $_.GetFiles().name -notcontains "Album.nfo" } | Select-Object FullName | Out-String
}
#endregion noAlbumnfo
我已经尝试了以下方法,但没有给我任何结果:
Get-ChildItem $path -recurse | Where-Object { $_.PSIsContainer -eq $True }`
| Where-Object { $_.GetFiles().name -notcontains "Artist.nfo"}`
| Where-Object { -! $_.GetFiles().name -contains "Album.nfo"}`
| Select-Object FullName | Out-String
我在这里错过了什么?
如果其中一个 .nfo 已经存在,您能告诉我如何排除这些文件夹吗?
我认为您无法排除这些文件夹。我的建议是找到所有 Artist.nfo 和 Album.nfo 文件,并将它们的父文件夹与所有文件夹的列表进行比较,差异应该就是您要查找的内容。
所以获取所有文件夹,保存在一个变量中。获取所有 Artist.nfo 和 Album.nfo 对象,然后对结果执行 Select -ExpandProperty Directory
并将其保存在第二个变量中。然后对它们执行 Compare-Object
以查找缺少 nfo 文件的文件夹。
$AllDirs = Get-ChildItem M:\* -recurse -directory
$NFOFound = Get-ChildItem M:\* -Include "Artist.nfo","Album.nfo" -recurse | Select -Expand Directory
Compare-Object $AllDirs -DifferenceObject $NFOFound -Property FullName | Where{$_.SideIndicator -eq "<="}
我刚刚编写了一个小脚本来提供我音乐库中所有文件夹的列表,其中不包括 Artist.nfo 或 Album.nfo。
我的文件夹结构是这样的:M:\Genre\Artist\Album
Artist.nfo 应位于艺术家中,Album.nfo 应位于专辑文件夹中。
因为我正在分别搜索这两个文件,所以我现在很难在搜索结果中排除其他 .nfo。
我当前的搜索功能:
#region noArtistnfo
function noArtistnfo
{
[CmdletBinding()]
param ($path)
Get-ChildItem $path -recurse | Where-Object { $_.PSIsContainer -eq $True }`
| Where-Object { $_.GetFiles().name -notcontains "Artist.nfo"}`
| Select-Object FullName | Out-String
}
#endregion noArtistnfo
#region noAlbumnfo
function noAlbumnfo
{
[CmdletBinding()]
param ($path)
Get-ChildItem $path -recurse | Where-Object { $_.PSIsContainer -eq $True }`
| Where-Object { $_.GetFiles().name -notcontains "Album.nfo" } | Select-Object FullName | Out-String
}
#endregion noAlbumnfo
我已经尝试了以下方法,但没有给我任何结果:
Get-ChildItem $path -recurse | Where-Object { $_.PSIsContainer -eq $True }`
| Where-Object { $_.GetFiles().name -notcontains "Artist.nfo"}`
| Where-Object { -! $_.GetFiles().name -contains "Album.nfo"}`
| Select-Object FullName | Out-String
我在这里错过了什么? 如果其中一个 .nfo 已经存在,您能告诉我如何排除这些文件夹吗?
我认为您无法排除这些文件夹。我的建议是找到所有 Artist.nfo 和 Album.nfo 文件,并将它们的父文件夹与所有文件夹的列表进行比较,差异应该就是您要查找的内容。
所以获取所有文件夹,保存在一个变量中。获取所有 Artist.nfo 和 Album.nfo 对象,然后对结果执行 Select -ExpandProperty Directory
并将其保存在第二个变量中。然后对它们执行 Compare-Object
以查找缺少 nfo 文件的文件夹。
$AllDirs = Get-ChildItem M:\* -recurse -directory
$NFOFound = Get-ChildItem M:\* -Include "Artist.nfo","Album.nfo" -recurse | Select -Expand Directory
Compare-Object $AllDirs -DifferenceObject $NFOFound -Property FullName | Where{$_.SideIndicator -eq "<="}