繁体   English   中英

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

[英]How to access variables defined in try catch scope in Powershell

我有下面的一段代码,我试图访问在 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

对于实际捕获不存在变量的 Get-Variable 失败的 try 语句。 我不得不添加-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
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM