【发布时间】:2014-01-14 22:58:54
【问题描述】:
我在终止 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
【问题讨论】:
-
我不明白你的代码。 Where-Object 过滤器未测试条件。
$_.Name -f "'C:\path\to\testauthapplist.txt'"没有意义,因为$_.Name不是格式字符串。也许有一个复制/粘贴错误?$_.Name和-f之间似乎缺少一些东西。另外,如果您只列出一次,如何再次遇到主机文件的第一行?这似乎不是一个需要退出条件的无限循环。 Foreach-Object 不会无限重复。也许只是因为代码被破坏而卡住了。 -
请说明您要使用
Where-Object { $_.Name -f "'C:\path\to\testauthapplist.txt'" |完成的任务。我怀疑问题在于这不是您尝试做的任何事情的正确语法。 -
我怀疑它会终止。它只是非常缓慢。
Get-WmiObject Win32_Product非常慢,您正在为输入文件中的每一行执行此操作。您应该在开始时执行一次并将结果保存在列表中。我同意 Adi 的观点,即你的 where-object 很奇怪。我认为你需要退后一步,重新设计整个事情。
标签: windows powershell windows-7 scripting