多个小程序

时间:2014-09-29 15:34:21

标签: powershell

关于编程逻辑,我是一个完整的菜鸟,非常感谢一些帮助。我的问题涉及Try Block中的Get-WmiObject win32_bios和Get-WmiObject win32_computersystem命令行开关。如果它们在没有另一个的情况下在那里,但不在一起,那么两者都按预期工作。它会生成一个电子邮件报告,其中包含域中的所有计算机,如下所示:

ServerName 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

1 个答案:

答案 0 :(得分:0)

我记得读过有关返回所有输出的函数。但是,使用第二时间的输出与前一个输出的对象不匹配。我想它会因为不匹配而被丢弃。您需要做的是使用来自两个查询的数据创建单个对象。如果你有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
}

从评论中更新

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

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