我正在尝试创建一个脚本,通过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文件和目录,因此我知道该部分正在运行。
非常感谢任何和所有帮助。如果我们可以在路径中省略带有调试的文件,这将是一个额外的好处。
答案 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\\"