作为我个人发展的一部分,我一直在研究Don Jones的powershell书籍中的以下示例,并且在使try / catch构造正常工作时遇到了一些麻烦。如您所见,当catch
块执行时,它会将名为$everything_ok
的变量设置为$false
- 这应该在以下代码中触发else
块。它做了什么 - 根据我的期望附加日志文件。
然而,它并没有阻止脚本执行if
块中的代码并在尝试查询虚拟机“NOTONLINE”时喷出“RPC服务器不可用”错误(异常类型)是System.Runtime.InteropServices.COMException
)。
这使得这个更奇怪的是我通过断点检查脚本,沿途检查$everything_ok
变量的内容,并且它在任何时候都不会包含错误的值。那么,当我指定的条件(if
)尚未满足时,为什么if ($everything_ok = $true)
块仍在执行'NOTONLINE'?
我在这里做错了吗?
function get-systeminfo {
<#
.SYNOPSIS
Retrieves Key Information on 1-10 Computers
#>
[cmdletbinding()]
param (
[parameter(mandatory=$true,valuefrompipeline=$true,valuefrompipelinebypropertyname=$true,helpmessage="computer name or ip address")]
[validatecount(1,10)]
[validatenotnullorempty()]
[alias('hostname')]
[string[]]$computername,
[string]$errorlog = "C:\retry.txt",
[switch]$logerrors
)
BEGIN {
write-verbose "Error log will be $errorlog"
}
PROCESS {
foreach ($computer in $computername) {
try {$everything_ok = $true
gwmi win32_operatingsystem -computername $computer -ea stop
} catch {
$everything_ok = $false
write-verbose "$computer not Contactable"
}
if ($everything_ok = $true) {
write-verbose "Querying $computer"
$os = gwmi win32_operatingsystem -computername $computer
$cs = gwmi win32_computersystem -computername $computer
$bios = gwmi win32_bios -computername $computer
$props = @{'ComputerName' = $cs.__SERVER;
'OSVersion' = $os.version;
'SPVersion' = $os.servicepackmajorversion;
'BiosSerial' = $bios.serialnumber;
'Manufacturer' = $cs.manufacturer;
'Model' = $cs.model}
write-verbose "WMI Queries Complete"
$obj = new-object -type psobject -property $props
write-output $obj
}
elseif ($everything_ok = $false) {
if ($logerrors) {
"$computer $_" | out-file $errorlog -append
}
}
}
}
END {}
}
get-systeminfo -host localhost, NOTONLINE -verbose -logerrors
答案 0 :(得分:4)
Powershell中的等号用作赋值操作。 -eq
用于测试相等性。所以你的if语句为$ everything_ok分配$ true,然后测试为true。