Emulando -ErrorAction en la función personalizada de powershell

Cómo emular -ErrorAction en la función personalizada de powershell. Por ejemplo, considere el siguiente script

function Foo2
{
  Write-Host "in Foo2"
  #...Error occurs 
  Foo3
}

function Foo1
{
   Write-Host "in Foo1"
   Foo2
}

function Foo3
{
   Write-Host "in Foo3"
}

PS> Foo1 -ErrorAction stop

¿Es posible detener la ejecución de Foo1 cuando se produce un error en Foo2, en lugar de continuar con la ejecución de Foo3?

preguntado el 10 de mayo de 11 a las 13:05

3 Respuestas

get-help about_Functions_CmdletBindingAttribute

Usted quiere:

function Foo1 () {[CmdletBinding ()] PARAM () proceso {Write-Host "in Foo1" Foo2}}

Esto no se trata de emulación, significa realmente implementar parámetros comunes en su función; si esta era tu intención.


Después de eso, puedes trabajar así:

Foo1 -ErrorAction stop

Puede utilizar la misma sintaxis para Foo2 y Foo3.


Para registrar el error, utilice la redirección como de costumbre.

Respondido el 14 de diciembre de 15 a las 15:12

Permítanme dejarlo en claro, al igual que cómo el cmdlet estándar se detendrá o continuará cuando se produzca un error en función del valor de ErrorAction, quiero que incluso Foo1 se comporte exactamente así y también me gustaría registrar el error. Cómo puedo hacer eso ? - Jeevan

Si utiliza cmdletbinding ¡Puedes hacer exactamente eso gratis! Ver mi edición. - Emiliano Poggi

Pequeña nota, la Write-Error las llamadas o los errores de los comandos anidados usarán eso, Write-Host no. :) - JasonMArcher

Aquí hay una muestra para ilustrar la respuesta de @Empo

function Test-ErrorAction
{
  [CmdletBinding()]
  Param( )

  begin 
  {
    Write-Host "I'am Here"    
   }

  Process 
  {
    Write-Error "coucou"
  }
  end 
  {
    Write-Host "Done !"
  }
}

clear
Test-ErrorAction -ErrorAction "silentlycontinue"
Test-ErrorAction -ErrorAction "stop"

da

I'am Here
Done !
I'am Here
coucou
 à C:\Développements\Pgdvlp_Powershell\Sources partagées\Menus Contextuel Explorer\Test-ErrorAction.ps1: ligne:23 caractère:17
+ Test-ErrorAction  <<<< -ErrorAction "stop"

contestado el 10 de mayo de 11 a las 21:05

NB: También vale la pena señalar que para ErrorAction para comportarse como es de esperar, debe generar errores con Write-Error. Si tu throw una excepción, ErrorAction / ErrorActionPreference no tiene influencia; la excepción es un Stop (error de terminación) por definición. stackoverflow.com/a/9295344/361842 - JohnLBevan

function Foo2
{
 Write-Host "in Foo2"
 Try {something} 
   Catch {
             Write-host "Foo2 blew up!"
             return
             }
 Foo3
 }

contestado el 10 de mayo de 11 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.