2010-09-15 13 views
10

Ho un semplice script PowerShell che viene eseguito quotidianamente per comprimere e spostare alcuni file di registro. Come posso verificare che il comando venga completato correttamente prima di eliminare il file di registro originale.Come confermare il completamento del comando precedente in PowerShell

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

Se il Move-Item completa ok Voglio rimuovere-item $ file_sorgente

risposta

21

Lo stato di completamento del comando precedente si può accedere tramite la variabile speciale $?.

Si noti che questo funziona meglio con errori non terminanti (come si otterrebbe da Move-Item). Gli errori di terminazione sono il risultato di una diretta throw o di un'eccezione generata in .NET e alterano il flusso del codice. Meglio usare una dichiarazione trap o try/catch per osservare questo tipo di errori.

Un'altra cosa da guardare fuori per WRT $? e console exes è che PowerShell assume un codice di uscita pari a 0 significa successo (vale a dire $? è impostato su $true) e qualsiasi altra cosa significa il fallimento ($? insieme a $false). Sfortunatamente non tutti i console exe osservano la convenzione sul codice di uscita, ad es. potrebbero esserci più codici di successo e un singolo codice di errore (0). Per quegli ex che non seguono le regole del codice di uscita, utilizzare $LastExitCode come indicato nei commenti per determinare il successo o l'insuccesso.

+1

Tante cose buone in questa risposta. Grazie –

+1

Anche per cercare di evitare qualsiasi tipo di "gotchya!" $? memorizza solo true/false per l'ultimo comando eseguito. Questo include incarichi variabili e altre cose a cui potresti non pensare come "comandi". – EdgeVB

+2

È anche possibile leggere da $ LASTEXITCODE per ottenere il codice di uscita effettivo restituito dalle applicazioni della console. –

1

A seconda del tipo di parnoid e del componente utilizzato per l'archiviazione, è possibile controllare l'archivio per confermare il file. Utilizziamo il componente DotNetZip per comprimere i nostri file di registro (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 
} 
Problemi correlati