我必须识别我们组织中的所有笔记本电脑。名为"computers“的单个OU。所有计算机都以使用它的用户的名称命名。没有关于计算机类型的信息。为了仅在笔记本电脑上部署软件,我必须将它们“隔离”。我运行了以下脚本。
$ErrorActionPreference = "silentlyContinue"
$coms=Get-ADComputer -Filter * -SearchBase "CN=Computers,DC=domain,DC=com" |select -exp name
Foreach($com in $coms)
{
Get-WmiObject win32_computersystem -comp $com | Select-Object PCSystemType,Name,Manufacturer,Model | format-table
} 它工作得很好。但排序并不那么容易。
我想让它变得更好,并运行了以下命令:
$ErrorActionPreference = "silentlyContinue"
$coms=Get-ADComputer -Filter * -SearchBase "CN=Computers,DC=domain,DC=com" |select -exp name
Foreach($com in $coms)
{
Get-WmiObject win32_computersystem -comp $com| Select-Object PCSystemType,Name,Manufacturer,Model | format-table
if ($com.PCSystemType -eq '2'){Write-host "$com is a laptop"}
else {Write-host "$com is a desktop"}
}我现在有了这样的结果:
COMP1 is a desktop
COMP2 is a desktop
COMP3 is a desktop
COMP4 is a desktop
LAPTOP1 is a desktop
LAPTOP2 is a desktop
LAPTOP3 is a desktop根据我的脚本,笔记本电脑和台式机都是台式机。我做错了什么?任何提示都会有帮助!谢谢
发布于 2018-07-16 22:34:44
Format-* cmdlet的目的是为控制台创建漂亮的输出;使人类可读。它通过创建与您传入的对象不同的对象来实现此目的。因此,您拥有不可用的对象,并且本质上是在访问$null。
删除| Format-Table将解决您的问题。
发布于 2018-07-17 17:32:19
在if循环中进行计算之前,您需要将WMI查询的值存储在变量中。
略有修改的版本:
$coms = @("localhost")
Foreach($com in $coms) {
$wmi = Get-WmiObject win32_computersystem -comp $com
switch ($wmi.PCSystemType) {
'0' { "$com is a Unspecified " }
'1' { "$com is a Desktop " }
'2' { "$com is a Mobile " }
'3' { "$com is a Workstation " }
'4' { "$com is a Enterprise Server" }
'5' { "$com is a SOHO Server" }
'6' { "$com is a Appliance PC" }
'7' { "$com is a Performance Server" }
'8' { "$com is a Maximum" }
Default { "Unable to get correct value for $com" }
}
}https://stackoverflow.com/questions/51363985
复制相似问题