2010-09-15 11 views
10

Tengo un script simple de powershell que se ejecuta diariamente para comprimir y mover algunos archivos de registro. ¿Cómo puedo probar que el comando se completa con éxito antes de eliminar el archivo de registro original?Cómo confirmar la finalización del comando anterior en powershell

set-location $logpath1 
& $arcprg $pram $dest_file $source_file 
Move-Item $dest_file $arcdir 

Si el Move-Item completa bien Quiero eliminar ítems $ fichero_origen

Respuesta

21

El estado de finalización de la orden anterior se puede acceder a través de la variable $? especial.

Tenga en cuenta que esto funciona mejor con errores sin terminación (como se obtendría de Move-Item). Los errores de terminación son el resultado de un throw directo o una excepción que se lanza en .NET y alteran el flujo de su código. Es mejor usar una declaración trap o try/catch para observar ese tipo de errores.

Otra cosa que mirar hacia fuera para WRT $? y de la consola de PowerShell exes es que asume un código de la salida de 0 significa éxito (es decir $? se establece en $true), y cualquier otra cosa significa el fracaso ($? conjunto de $false). Lamentablemente, no todos los miembros de la consola observan la convención del código de salida, p. puede haber múltiples códigos de éxito y un único código de falla (0). Para aquellos exes que no siguen las reglas del código de salida, use $LastExitCode como se señala en los comentarios para determinar el éxito o el fracaso.

+1

Muchas cosas buenas en esta respuesta. Gracias –

+1

También para tratar de prevenir cualquier tipo de "gotchya!" ps solo almacena verdadero/falso para la última ejecución del comando. Esto incluye asignaciones variables y otras cosas que quizás no consideres como "comandos". – EdgeVB

+2

También puede leer desde $ LASTEXITCODE para obtener el código de salida real devuelto por las aplicaciones de la consola. –

1

Dependiendo de qué tan parnoide sea y qué componente esté utilizando para archivar, puede verificar el archivo para confirmar el archivo exixts. Usamos el componente DotNetZip para comprimir nuestros archivos de registro de archivos (http://dotnetzip.codeplex.com/).

$zipFileObj = new-object Ionic.Zip.ZipFile($zipName); 

[void] $zipFileObj.UpdateFile("$fileName", "") # adds file if doesn't already exist 

trap #catch an zip errors and Stop processing 
{ 
    write-error "Caught a system exception. Execution stopped" 
    write-error $("TRAPPED: " + $_.Exception.Message); 
    exit 
} 

if ($zipFileObj.ContainsEntry($fileName)) 
{ 
    remove-item $pathFile # delete file from file-system 
} 
else 
{ 
    # throw error 
} 
Cuestiones relacionadas