我有下面的一段代码,我试图访问在 try 中定义的变量,但它无法访问,可以做些什么来修复它。
try{
$X = get-X
}
catch
{
Manage exception
}
write-host $X
我有下面的一段代码,我试图访问在 try 中定义的变量,但它无法访问,可以做些什么来修复它。
try{
$X = get-X
}
catch
{
Manage exception
}
write-host $X
我刚遇到这个,它看起来像一个错误。在 try 块之外声明变量并不能解决范围问题。一旦您离开,$a 的 try 块值就会重置为进入 try 块之前的值。因此,如果您想在执行 try{} 后访问 $a,您需要在 try {} 块中以 $global:a 的形式访问它。
get-process
对我来说,这会像简单命令一样返回所有进程:
try
{
$a = get-process
}
catch
{
write-error "Some error occurred"
}
$a
正如@Christian 所说,它应该可以按照您的方式正常工作。如果$x
没有被填充,可能Get-X
没有返回任何内容,或者正在发生错误。
您始终可以使用在顶部声明变量的模式:
$a = <default value, or $null>
try
{
$a = get-process
}
catch
{
write-error "Some error occurred"
}
$a
让try语句真正捕捉到一个不存在的变量的Get-Variable失败。我不得不添加-ErrorAction
开关。默认ErrorAction
是继续,这不允许 try 语句捕获错误。
$testName = Get-Variable -Name $variableName -ErrorAction Stop
我在先前的答案中添加了评论,但觉得有必要发布一个示例 Powershell 函数(在类的上下文中)来证明使用范围界定($private
在我的情况下)解决了这个问题:
[String[]] static GetSRVHostPort([String]$srvRecord) {
[String] $private:myHost, $private:myPort
try {
$private:myHost, $private:myPort = Resolve-DnsName -Type 'srv' $srvRecord | ForEach-Object { $_.Name, $_.Port }
} catch {
Write-Output("Exception thrown whilst resolving DNS SRV record [$srvRecord]: $_")
}
return $private:myHost, $private:myPort
}