从内部方法访问$args/参数



我正在为我的PowerShell脚本开发一种错误处理方法。我通过 catch 上的 try/catch 传递错误,但我想从调用它的命令行迭代原始参数以创建错误日志和错误电子邮件。

这是我到目前为止所拥有的:

# --params--
param(
  [string]$Directory,
  [string]$ArchiveDirectory,
  [string]$ErrorDirectory,
  [string]$ErrorEmailFrom,
  [string]$ErrorEmailTo,
  [string]$ErrorEmailSubject,
  [string]$ErrorSMTP,
  [string]$FTPSite,
  [string]$FTPUser,
  [string]$FTPPass,
  [string]$FTPRemoteDir
)
# list of arguments for debug
$paramList = $args
# --functions--
function Handle-MyError
{
  Write-Host "handle-error"
  Write-Host $args[0];  # this is the exception passed in
  # -Email alert-
  $subject = $ErrorEmailSubject + $FTPSite 
  # build message
  $message =  Get-Date -Format "yyyy-mm-dd hh:mm:ss" 
  $message += "`r`nError: " + $FTPSite + " : " + $args[0]
  $message += "`r`nParameters:`r`n" 
  # Grab each parameter value, using Get-Variable
  for ($i=0;$i -lt $paramList.Length; $i++)
  {
    $message += $paramList[$i]
  }
  # send email
  $smtp = New-Object Net.Mail.SmtpClient($ErrorSMTP)
  $smtp.Send($ErrorEmailFrom, $ErrorEmailTo, $subject, $message)
  # drop error file
  $theDate = Get-Date -Format "yyyymmdd"
  $errorFile = $ErrorDirectory + "" + $theDate + "_ERROR.txt"
  Write-Host $errorFile
  $message | Out-File $errorFile -Append
}

在我的try/catch中:

catch [Exception]
{
  Write-Host "SPOT 1"
  Handle-MyError $_.
}

在顶部,我尝试将原始$args保存为$paramList以便稍后循环,但它不起作用。在 Handle-MyError 方法中,$args成为传递的错误,所以我想如果我将原始$args保存为$paramList以后可以访问它,但它很不稳定......想法?

有几种方法,按从最差到最好的顺序:

Get-VariableScope参数一起使用。范围编号可以不同,但应至少为 2 (Script->Catch->Handle-MyError

function Handle-MyError
{
   Write-Host (Get-Variable -Name ErrorEmailFrom -ValueOnly -Scope 2)
}

使用$Script:前缀

function Handle-MyError
{
   Write-Host $Script:ErrorEmailFrom
}

使用$PSBoundParameters

# list of arguments for debug
$paramList = $PsBoundParameters
function Handle-MyError
{
   Param
   (
       $Exception,
       $Cfg
   )
   Write-Host $Cfg.ErrorEmailFrom
}
catch [Exception]
{
    Write-host "SPOT 1"
    Handle-MyError -Exception $_ -Cfg $paramList
}

使用拼接:

$paramList = $PsBoundParameters
function Handle-MyError
{
    Param
    (
        $Exception,
        $ErrorDirectory,
        $ErrorEmailFrom,
        $ErrorEmailTo,
        $ErrorEmailSubject,
        $ErrorSMTP
    )
    Write-Host $ErrorEmailFrom
}
catch [Exception]
{
    Write-host "SPOT 1"
    Handle-MyError @paramList -Exception $_
}
这是我

在@beatcracker的帮助下最终的代码。我把拼图的两块组合在一起。

  1. 我需要将初始参数保存在本地变量和 Two( $paramList = $PsBoundParameters)
  2. 使用 访问此变量/列表。GetEnumerator()

    # --params--
    param(
        [string]$Directory,
        [string]$ArchiveDirectory,
        [string]$ErrorDirectory,
        [string]$ErrorEmailFrom,
        [string]$ErrorEmailTo,
        [string]$ErrorEmailSubject,
        [string]$ErrorSMTP,
        [string]$FTPSite,
        [string]$FTPUser,
        [string]$FTPPass,
        [string]$FTPRemoteDir
    )
    # set params as var for debug later
    $paramList = $PsBoundParameters
    # --functions--
    function Handle-MyError
    {
        Write-Host "handle-error"
        #write-host "Exception:" $args[0];  # this is the exception passed in
        # -Email alert-
        # build subject
        $subject = $ErrorEmailSubject + " " + $FTPSite 
        # build message
        $message =  Get-Date -format s
        $message += "`r`nError Message: " + $args[0]
        $message += "`r`nParameters:`r`n" 
        $paramList.GetEnumerator() | ForEach-Object `
        {
            #Write-Host $_.Key "=" $_.Value
            if ($_.Key -ne "FTPPass"){
                $message += "`r`n" + $_
            }
        }
    }
    

最新更新