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\"
我正在尝试创建一个脚本,它将通过 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\"