Powershell Where-Object排除结果

问题描述:

我刚刚写了一个小脚本给我一个我音乐库中不包含Artist.nfo或Album.nfo的所有文件夹的列表。Powershell Where-Object排除结果

我的文件夹结构是这样的:M:\流派\艺术家\专辑

的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 "<="} 
+0

是的谢谢。我猜到了。 这是一个很好的方法。 – StUffz 2015-04-06 12:21:54