正在中断PowerShell v2中的foreach循环



我在PowerShell v2中终止foreach对象循环时遇到问题。对于我试图完成的任务的大致想法,以下是伪代码:

  • 从文本文件中读取主机列表
  • 对于文本文件中的每个主机,获取Win32_Product(根据排除列表进行筛选),将输出转换为html并保存

脚本的原因是我收集了一个文本文件,列出了标准客户端映像中包含的所有应用程序,并希望定期从另一个文本文档扫描主机,看看主机上是否有任何未经授权、粗略或不必要的应用程序。

代码确实可以粗略地工作,但我遇到的主要问题是,如果没有手动干预,脚本不会终止。我想我在这里缺少的组件是运行循环,直到某个条件存在(即第二次遇到主机文件中的第一行),然后终止脚本。尽管这是我设想的方法,但我总是对其他逻辑持开放态度,尤其是如果它更有效的话。

这是实际代码:

Get-Content c:pathtotesthostlist.txt | Foreach-Object {
Get-WmiObject Win32_Product | 
Where-Object { $_.Name -f "'C:pathtotestauthapplist.txt'" | 
ConvertTo-Html name,vendor,version -title $name -body "<H2>Unauthorized Applications.</H2>"}} |
Set-Content c:pathtounauthapplisttest.html  

我看不出主机文件的第一行(我推断你的意思是testhostlist.tx)会再次出现,因为你只列出了一次。这似乎甚至不是一个需要退出条件的无限循环Foreach对象不会无限期重复。

在我看来,问题不在于循环没有条件就不能退出,而是语法无效。

  1. Where Object通过只传递满足特定条件的对象来过滤管道,但后面的脚本块不执行布尔测试
  2. 事实上,脚本块的内容本身并不是有效的-f是格式运算符,将格式字符串作为左操作数,但$_.Name不是格式字符串

根据您的描述,我将在这里猜测,其想法是为Name属性未在testauthapplist.txt中列出的对象过滤Get-WmiObject Win32_Product的结果(我认为这就是您所指的"排除列表")。如果是,这是正确的语法:

Get-Content c:pathtotesthostlist.txt | %{
Get-WmiObject Win32_Product | ?{
(Get-Content 'C:pathtotestauthapplist.txt') -notcontains $_.Name
} | ConvertTo-Html name,vendor,version -title $name -body "<H2>Unauthorized Applications.</H2>"
} | Set-Content c:pathtounauthapplisttest.html

(注意,%{}?{}分别只是Foreach对象Where对象

如果我理解正确,你是在试图完全停止脚本吗?如果是,您尝试过Break吗?如果您只想跳过一个循环,请使用continue

$hostlist = Get-Content c:pathtotesthostlist.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:pathto$item"-applist.html"
}

最新更新