Get-ChildItem过滤器没有带回任何结果

时间:2015-01-06 13:23:24

标签: powershell

我正在尝试创建一个脚本,通过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文件和目录,因此我知道该部分正在运行。

非常感谢任何和所有帮助。如果我们可以在路径中省略带有调试的文件,这将是一个额外的好处。

1 个答案:

答案 0 :(得分:2)

从我所看到的$releaseList必须包含一个字符串数组。 (必须猜测,因为我们无法看到这个功能)。这些字符串必须匹配文件夹名称才能进行比较。突出显示以下代码。

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

看起来您正在返回管道中当前文件的祖父文件夹。如果你的文件是' C:\ temp \ inst - 复制\打印机inst.log'例如,它将返回" 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]}

因此,如果您尝试匹配的文件具有类似

的路径
  

生产\部署\安装\ validationtool \ BIN \释放\ test.msi

我们将路径分成$_.Split('\')给出

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

我们使用[-4]来获取第4个文件夹名称&#34; validationtool&#34;

另外,如果你想从路径中省略调试,你可以使用另一个像这样的

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

如果你想确定它只是文件夹名称而不是带有调试的文件,你可以稍微改变一下。

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