2013-05-14 14 views
7

Robocopy uscirà con un codice sopra lo 0 e ancora probabilmente non sarà un errore. PSake rileva qualcosa sopra lo 0 come un fallimento e fallisce la costruzione. Questo va bene, ma come mai questo ancora fallisce:Fallimento di Psake e robocopy

task Deploy {  
     robocopy $source $dest /NP /S /XO /NFL /NDL /NJH /NJS | Out-Default 

    if ($lastexitcode -eq 3) 
    { 
     Write-Host "Got Here" 
     $lastexitcode = 0  
    } 

    Write-Host "Deploy local complete" 
    Write-Host $lastexitcode 
} 

TaskTearDown { 
    if ($LastExitCode -ne 0) { 
     write-host "Build failed" 
     exit 1 
    } 
} 

posso verificare che il Deploy if viene colpito e le uscite di Write-Host 0, in modo corretto, ma la TaskTearDown rileva ancora l'ultimo codice di uscita come 3! Come posso risolvere questo?

+2

non vorrei assegnare '$ lastexitcode', è una variabile automatica. L'assegnazione crea forse una variabile locale e 'TaskTearDown' vede ancora l'originale. In ogni caso cerca di utilizzare un approccio diverso senza '$ lastexitcode = 0'. –

risposta

9

robocopy i codici di uscita sotto 8 sono codici di stato non di errore. Solo i codici di uscita 8 e superiori indicano un errore. Vedi here.

Il motivo per cui il vostro compito teardown segnala ancora un codice di uscita 3 è probabilmente perché la variabile automatica $LastExitCode è una variabile globale, mentre il vostro compito implementare crea un ulteriore locale variabile $lastexitcode che maschera la variabile globale nel portata del compito. Come suggerito in this answer a una domanda simile, usare il prefisso $global::

$global:LastExitCode = $null 
+0

Ah è un problema di scoping! Grazie! Ancora molto nuovo per elegante. In realtà, PSake cerca 0 e gira su null ... quindi $ global: LastExitCode = 0 è ciò di cui ho bisogno. –