如何在Powershell中访问try catch范围中定义的变量

时间:2012-09-25 08:06:29

标签: powershell

我有下面的代码,我试图访问在try中定义的变量,但它无法访问,可以采取哪些措施来修复它。

  try{
       $X = get-X 
     }
  catch
     {
            Manage exception
     }

   write-host $X

5 个答案:

答案 0 :(得分:3)

我刚碰到这个,看起来像个bug。在try块外声明变量不能解决范围问题。一旦你离开try a块值$ a就会重置为你输入try block之前的值。所以如果你想在执行try {}之后访问$ a,你需要在try {}块中以$ global:a的形式访问它。

答案 1 :(得分:0)

对我而言,这将返回所有简单get-process命令的进程:

try
{
   $a = get-process
}
catch
{
    write-error "Some error occurred"
}

$a

答案 2 :(得分:0)

正如@Christian所说,它应该可以正常工作。如果未填充$x,则Get-X可能未返回任何内容,或者发生错误。

你可以随时使用声明变量的模式:

$a = <default value, or $null>
try
{
   $a = get-process
}
catch
{
    write-error "Some error occurred"
}
$a

答案 3 :(得分:0)

为了使try语句实际捕获不存在的变量的Get-Variable失败。我必须添加-ErrorAction开关。默认的ErrorAction是继续,这不允许try语句捕获错误。

$testName = Get-Variable -Name $variableName -ErrorAction Stop 

答案 4 :(得分:0)

我在先前的回答中添加了评论,但感到有必要发布示例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
    }

有关范围的更多详细信息:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-6#scope-modifiers