我需要一次重启AD中的所有计算机(不包括我的计算机),确认每个计算机已重新启动,然后重新启动下一个计算机。系统重启后,我想查看它的IP地址和名称。以下是我的尝试,但我认为我做错了,因为它不起作用。我收到的主要错误是:
Get-WMIObject: cannot validate argument on parameter 'computerName'. The argument is null or empty
+ $serverobj = gmi Win32_operatingsystem -computername $i.server
代码:
$servers= Get-ADComputer -Filter * | Select-Object -ExpandProperty name
foreach($i in $servers) {
Write-Host "Rebooting:" $i.server "..."
$serverObj = gwmi Win32_operatingsystem -computer $i.server
$status = $serverObj.reboot()
if ($status.ReturnValue = "0") {
Write-Host "Reboot successful."
} else {
Write-Host "Reboot failed."
}
do {
Start-Sleep -s 2 } # this will wait for 2 seconds
while (Test-Connection $servers -count 1 | select @{Name="Computername";Expression={$_.Address}},Ipv4Address)
}
答案 0 :(得分:4)
这个似乎足以解决您的直接问题:
$serverObj = gwmi Win32_operatingsystem -computer $i.server
应该是
$serverObj = gwmi Win32_operatingsystem -computer $i
$i
没有超出[string]
的属性。默认情况下,PowerShell将允许您尝试获取不存在的属性,并且在这种情况下将返回null。但Get-WMIObject
不能用于参数-Computer
。错误非常具体。
有一种方法可以尝试捕获这些问题但是使用Set-StrictMode -Version 2.0
例如。来自TechNet
2.0
- 禁止引用未初始化的变量(包括字符串中未初始化的变量)。
- 禁止引用对象的不存在的属性。
- 禁止使用调用方法语法的函数调用。
- 禁止没有名称的变量($ {})。
您指的是您收到的主要错误 ...这是否意味着您有更多?
您的while
状况似乎有缺陷。您应该尝试评估布尔表达式,但您只是返回数据。即使ping失败,也应该返回数据,这可能会使循环逻辑无效。考虑使用-Quiet
开关test-connection
。您还在检查所有 $servers
而不只是$i
的ping。
while (!(Test-Connection $i -count 1 -Quiet))
也许...