【问题标题】:Multiple commandlets多个命令行开关
【发布时间】:2014-09-29 15:34:21
【问题描述】:

在编程逻辑方面,我是一个完全的菜鸟,我们将不胜感激。我的问题涉及 Try Block 中的 Get-WmiObject win32_bios 和 Get-WmiObject win32_computersystem commandlet。如果他们在没有另一个但不在一起的情况下,两者都按预期工作。它会生成一个包含域中所有计算机的电子邮件报告,如下所示:

服务器名称   BIOS 版本                                                                                  序列号

exserver           DELL - 1 Phoenix ROM BIOS PLUS 版本 1.10 2.7.0         3ZTVDC1

我想添加型号,但该属性不在 win32_bios 中(至少我知道)。所以,我打算从 win32_computersystem 中获取它。就像我说的,他们都工作,只是不在一起。它总是只运行第一个命令行开关,然后转到列表中的下一台计算机。

Import-Module ActiveDirectory

function getthebios {
$badcomp = @()
$CompList = Get-ADComputer -Filter 'name -like "*"' | select -ExpandProperty Name
foreach ($c in $CompList) {

Try {
 Get-WmiObject win32_bios -ComputerName $c |
 Select-Object @{l='ServerName';e= {$_.__SERVER} },
 @{l='BIOS version';e = {$_.BIOSVersion} },
 @{l='Serial Number';e = {$_.SerialNumber} }


 Get-WmiObject win32_computersystem -ComputerName $c |
 Select-Object @{l='Model Number';e = {$_.Model} }


 }

 Catch {
 $badcomp += $c
 }

 }
 "the following servers could not be reached:"
 $badcomp
 }
 Send-MailMessage -To person@example.com -From "person@example.com" -SmtpServer     
 server.domain.net -Subject "BIOS Version Report" -body (getthebios | Sort-Object 'BIOS version'   
 | convertTo-Html | out-string ) -BodyAsHtml

【问题讨论】:

  • 请花时间最小化您的代码。目前有很多不必要的行,例如Get-ADComputerSend-MailMessage。让这个在我们的机器上重现,然后我们可以提供帮助。

标签: powershell


【解决方案1】:

我记得读过有关返回所有输出的函数。但是,您使用 second 时间的输出与前一个的对象不匹配。我想它由于不匹配而被丢弃。您需要做的是使用来自两个查询的数据创建一个对象。如果您有 PowerShell 3.0,这应该可以代替您的 Try

 $bios = Get-WmiObject win32_bios -ComputerName $c | Select-Object __SERVER, BIOSVersion, SerialNumber
 $computerSystem = Get-WmiObject win32_computersystem -ComputerName $c | Select-Object Model
 [psCustomObject]@{
    "ServerName" = $bios.__SERVER
    "BIOS version" = $bios.BIOSVersion
    "Serial Number" = $bios.SerialNumber
    "Model" = $computerSystem.Model
 }

将两个WMI 调用的输出捕获到变量中。在单个对象中输出两者的结果。这两行中的Select-Object 语句不是必需的,但因为我们只需要这些数据,所以它是有意义的。现在输出的数据将匹配。如果你有,以下将在 2.0 PowerShell 中工作

New-Object psobject -Property @{
    "ServerName" = $bios.__SERVER
    "BIOS version" = $bios.BIOSVersion
    "Serial Number" = $bios.SerialNumber
    "Model" = $computerSystem.Model
}

来自 cmets 的更新

我也注意到了这一点。我所做的就是将其转换为字符串

"BIOS version" = [string]$bios.BIOSVersion

【讨论】:

  • 哇,谢谢马特。这成功了……几乎。我正在运行 PS 4.0 版并尝试了这两个选项。两个选项都在电子邮件中返回了正确的数据,除了 BIOSVersion 现在以“System.String[]”代替“DELL - 1 Phoenix ROM BIOS PLUS Version 1.10 2.7.0”。我相信我可以从这里弄清楚。发生这种情况时我会更新。再次感谢。
  • @JoshuaWieberg 如果您还没有提出解决方案,请查看我的更新答案。
  • 太棒了。我最终将其更改为 Name 属性。 '"Bios version" = $bios.Name' 这似乎也有效。再次感谢,马特!当我更多地了解这一切时,我希望在未来做出贡献。干杯。
  • 如果我的回答有帮助,请将其标记为带有复选标记的答案。
猜你喜欢
  • 2013-08-04
  • 2021-10-20
  • 2011-05-22
  • 2012-04-02
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多