关于编程逻辑,我是一个完整的菜鸟,非常感谢一些帮助。我的问题涉及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
答案 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
语句不是必需的,但由于我们只需要这些数据,因此它是有意义的。现在输出的数据将匹配。如果您有
New-Object psobject -Property @{
"ServerName" = $bios.__SERVER
"BIOS version" = $bios.BIOSVersion
"Serial Number" = $bios.SerialNumber
"Model" = $computerSystem.Model
}
从评论中更新
我也注意到了这一点。我所做的就是将其转换为字符串
"BIOS version" = [string]$bios.BIOSVersion