我无法在PowerShell v2中终止foreach-object循环。对于我想要完成的任务的粗略概念,这里是伪代码:
脚本的原因是我收集了一个文本文件,其中列出了标准客户端映像中包含的所有应用程序,并且希望定期扫描来自其他文本文件的主机,以查看是否存在任何未经授权,粗略或其他不必要的应用程序在主机上。
代码确实在粗略的意义上工作,但我遇到的主要问题是脚本不会在没有人工干预的情况下终止。我想这里我缺少的组件是运行循环直到某些条件存在(即第二次遇到主机文件中的第一行),然后终止脚本。虽然这是我设想的方法,但我总是对其他逻辑开放,特别是如果它更有效。
这是实际的代码:
Get-Content c:\path\to\testhostlist.txt | Foreach-Object {
Get-WmiObject Win32_Product |
Where-Object { $_.Name -f "'C:\path\to\testauthapplist.txt'" |
ConvertTo-Html name,vendor,version -title $name -body "<H2>Unauthorized Applications.</H2>"}} |
Set-Content c:\path\to\unauthapplisttest.html
答案 0 :(得分:2)
我没有看到主机文件的第一行(我推断你的意思是 testhostlist.tx )第二次会遇到,因为你只列出一次。这似乎甚至不是一个需要退出条件的无限循环。 Foreach-Object 不会无限期重复。</ p>
在我看来,问题不在于没有条件循环不会退出,而是语法无效。
$_.Name
不是格式字符串。我将根据您的描述猜测,我们的想法是为名称属性未列在<中的对象过滤Get-WmiObject Win32_Product
的结果strong> testauthapplist.txt (我认为这是你所指的“排除列表”)。如果是这样,这是正确的语法:
Get-Content c:\path\to\testhostlist.txt | %{
Get-WmiObject Win32_Product | ?{
(Get-Content 'C:\path\to\testauthapplist.txt') -notcontains $_.Name
} | ConvertTo-Html name,vendor,version -title $name -body "<H2>Unauthorized Applications.</H2>"
} | Set-Content c:\path\to\unauthapplisttest.html
(请注意,%{}
和?{}
只是 Foreach-Object 和 Where-Object 的缩写。)
答案 1 :(得分:1)
如果我理解你正确,你试图完全停止你的脚本?如果是,你试试Break
?
如果您只想跳过循环,请使用continue
答案 2 :(得分:0)
$hostlist = Get-Content c:\path\to\testhostlist.txt
$a = @()
Foreach($item in $hostlist)
{
$a += "<style>"
$a += "BODY{background-color:gray;}"
$a += "TABLE{margin: auto;border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a += "TH{border-width: 1px;padding: 4px;border-style: solid;border-color: black;background-color:yellow}"
$a += "TD{border-width: 1px;padding: 4px;border-style: solid;border-color: black;background-color:white}"
$a += "h2{color:#fff;}"
$a += "</style>"
Get-WmiObject Win32_Product | select name,vendor,version | sort name | ConvertTo-Html -head $a -body "<Center><H2>Unauthorized Applications.</H2></Center>" | Out-File c:\path\to\$item"-applist.html"
}