2012-04-17 16 views
8

Tiene un problema con el comando Capturar. Tengo el siguiente script que estoy tratando de proceso:Problemas con la captura en PowerShell

Try 
    { 
    Add-Computer -DomainName "MyDomain.Dom" -Credential $DomainCred -PassThru -ErrorAction Stop 
    } 

Catch [System.InvalidOperationException] 
    { 
    "Your Computer Is Unable To Contact The Domain" 
    } 

Cada vez que funciono esto, sin embargo no estoy recibiendo nada en la captura. Aquí está el error informado que obtengo de la secuencia de comandos:

PSMessageDetails  : 
Exception    : System.InvalidOperationException: This command cannot be executed on target computer('') due to following error: The specified domain either does not exist or could not 
         be contacted. 
TargetObject   : 
CategoryInfo   : InvalidOperation: (MYPC:String) [Add-Computer], InvalidOperationException 
FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.AddComputerCommand 
ErrorDetails   : 
InvocationInfo  : System.Management.Automation.InvocationInfo 
PipelineIterationInfo : {0, 1} 

¿Alguna idea?

Solución de Trabajo (Gracias a PK y Patrick por sus contribuciones combinadas)

Try 
    { 
    Add-Computer -DomainName "MyDomain.Dom" -Credential $DomainCred -PassThru -ErrorAction Stop 
    } 

Catch [System.Management.Automation.RuntimeException] 
    { 
    "Your Computer Is Unable To Contact The Domain" 
    } 

Respuesta

3

tratar de atrapar System.Management.Automation.RuntimeException en lugar de System.InvalidOperationException.

Try 
{ 
    Add-Computer -DomainName "MyDomain.Dom" -Credential $DomainCred 
} 

Catch [System.Management.Automation.RuntimeException] 
{ 
    'Error: {0}' -f $_.Exception.Message 
} 
+0

Gracias por la respuesta, lo reemplacé con System.Management.Automation.RuntimeException pero todavía tengo el mismo problema. Incluso intenté sacar cualquier error y usar solo Catch, pero el problema persiste. –

+0

¿No puedes entrar al bloque Catch? Prueba esto y dime lo que la salida es: tratar { \t tiro } { Catch \t $ _ Exception.GetType() |. seleccione FullName } –

0
FullName                                         
--------                                         
System.Management.Automation.RuntimeException                                
The object of type "Microsoft.PowerShell.Commands.Internal.Format.FormatStartData" is not valid or not in the correct sequence. This is likely caused by a user-specified "f 
ormat-list" command which is conflicting with the default formatting. 
    + CategoryInfo   : InvalidData: (:) [out-lineoutput], InvalidOperationException 
    + FullyQualifiedErrorId : ConsoleLineOutputOutOfSequencePacket,Microsoft.PowerShell.Commands.OutLineOutputCommand 
1

pude conseguir que esto funcione:

Try 
    { 
    Add-Computer -DomainName "MyDomain.Dom" -Credential $DomainCred -PassThru -ErrorAction Stop 
    } 

Catch 
    { 
    "Your Computer Is Unable To Contact The Domain" 
    } 

-PassThru en el comando Add-Computer devuelve los resultados del comando de la cáscara.

-ErrorAction Stop indica a PowerShell que se detenga cuando detecta un error; esto suprime la salida de error que estaba viendo.

2

Agregue "-ErrorActionPreference Stop" a su CmdLet.

Por ejemplo,

Add-Computer -DomainName "MyDomain.Dom" -Credential $DomainCred -EA Stop 

Hay que parecen ser un par de inconsistencias con las formas en que los errores de proceso diferentes cmdlets, especialmente los "add-on" cmdlets como los de Active Directory. Sin embargo, creo que la idea básica es que Powershell Catch solo atrapa los errores de terminación, cuya excepción anterior no es la predeterminada. Entonces, al usar -EA Stop, lo estás forzando a que sea un error de terminación, que desencadena el bloque Catch.

Aquí es Ed Wilson sobre el tema: http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx

0

Patrick: Gracias, que hizo el truco. Poner el -Passthru en él le permitió detectar el error. Actualicé la publicación original con la respuesta.

Cuestiones relacionadas