在PowerShell v2中打破foreach循环

时间:2014-01-14 22:58:54

标签: windows powershell windows-7 scripting

我无法在PowerShell v2中终止foreach-object循环。对于我想要完成的任务的粗略概念,这里是伪代码:

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

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

代码确实在粗略的意义上工作,但我遇到的主要问题是脚本不会在没有人工干预的情况下终止。我想这里我缺少的组件是运行循环直到某些条件存在(即第二次遇到主机文件中的第一行),然后终止脚本。虽然这是我设想的方法,但我总是对其他逻辑开放,特别是如果它更有效。

这是实际的代码:

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  

3 个答案:

答案 0 :(得分:2)

我没有看到主机文件的第一行(我推断你的意思是 testhostlist.tx )第二次会遇到,因为你只列出一次。这似乎甚至不是一个需要退出条件的无限循环。 Foreach-Object 不会无限期重复。<​​/ p>

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

  1. Where-Object 通过仅传递满足特定条件的对象来过滤管道,但后面的scriptblock不执行布尔测试。
  2. 实际上,scriptblock的内容本身并不显示有效。 -f 是格式运算符,并将格式字符串作为左操作数,但$_.Name不是格式字符串。
  3. 我将根据您的描述猜测,我们的想法是为名称属性未列在<中的对象过滤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"
}