Get-ChildItem Where 过滤器不带回任何结果

Get-ChildItem Where filter not bringing back any results

我正在尝试创建一个脚本,它将通过 powershell 为我的 MSI 文件签名。我已经对签名工具进行了排序,但我遇到的问题是获取我的 MSI 文件。

考虑以下文件夹树。

production
└───deployment
    └───install
        └───validationtool
            │   test.msi
            │
            └───bin
                ├───debug
                │       test.msi
                │
                └───release
                        test.msi

我使用的代码是

$target = "*.msi"
$releaseList = "vt.Setup", "ieh", "vt" 
$requiredFiles = gci $path -recurse -filter $target | ?{ $releaseList -contains ((Split-Path $_.Directory).Split('\') | Select -Last 1)}

我正在尝试查找 MSI 文件,其中第 3 层文件夹是 $releaseList 中的文件夹之一。目前它没有返回正确的文件夹。

如果我只使用下面的行

$requiredFiles = gci $path -recurse -filter $target 

它使我恢复了所有 MSI 文件和目录,因此我知道该部分正在运行。

非常感谢任何帮助。作为奖励,如果我们可以省略路径中带有调试的文件,那将很有帮助。

据我所知,$releaseList 必须包含一个字符串数组。 (必须猜测,因为我们看不到该功能)。这些字符串必须与文件夹名称匹配才能使您的比较有意义。突出显示以下代码。

((Split-Path $_.Directory).Split('\') | Select -Last 1)

看起来您正在 return管道中当前文件的祖父文件夹。例如,如果您的文件 'C:\temp\inst - Copy\printer inst.log',它将 return "temp"。如果数组 $releaseList 包含一个名为 "Temp" 的元素,那么此文件将满足您的 Where-Object

我对此的评论是,它看起来真的可以用这样的东西来简化:$releaseList -contains [string]($_.Directory.Parent)

这就是您要实现的目标吗?我错了吗?

讨论后更新

经过讨论后发现 OP 需要匹配文件夹并且逻辑是正确的接受文件夹深度不正确。祖父文件夹是过滤器正在验证的文件夹。然而根据 $releaseList 的内容,它实际上是我们需要匹配的曾祖父文件夹。鉴于您需要回溯多远,通过 .Split() 使用字符串操作可能比内置 cmdlet Split-Path

更容易
Get-ChildItem $path -Recurse -filter $target | 
    Select-Object -ExpandProperty Fullname | 
    Where-Object{$releaseList -contains $_.Split('\')[-4]}

因此,如果您尝试匹配的文件的路径类似于

production\deployment\install\validationtool\bin\release\test.msi

我们用 $_.Split('\') 将路径分成几个部分

production
deployment
install
validationtool   <---- that is the one we are matching against. 
bin
release
test.msi

我们使用 [-4] 来抓取倒数第四项,即文件夹名称 "validationtool"

此外,如果您希望从路径中省略调试,您可以使用另一个子句,例如

$releaseList -contains $_.Split('\')[-4] -and $_ -notmatch "debug"

如果您想确定它只是文件夹名称而不是其中包含调试的文件,您可以稍微更改匹配项。

$releaseList -contains $_.Split('\')[-4] -and $_ -notmatch "\debug\"