tags:

views:

58

answers:

2

I have a simple powershell script that gets ran daily to compress and move some log files. How can i test that the command completes successfully before deleting the original log file.

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

If the Move-Item completes ok i want to remove-item $source_file

+7  A: 

The completion status of the previous command can be accessed via the special variable $?.

Note that this works best with non-terminating errors (like you would get from Move-Item). Terminating errors are the result of a direct throw or an exception getting thrown in .NET and they alter the flow of your code. Best to use a trap or try/catch statement to observe those type of errors.

One other thing to watch out for WRT $? and console exes is that PowerShell assumes an exit code of 0 means success (i.e. $? is set to $true) and anything else means failure ($? set to $false). Unfortunately not all console exe's observe that exit code convention e.g. there may be multiple success codes and a single failure code (0). For those exes that don't follow the exit code rules, use $LastExitCode as pointed out in the comments to determine success or failure.

Keith Hill
So much good stuff in this answer. Thank you
Mike Forman
Also to try and prevent any sort of "gotchya!" $? only stores true/false for the last command run. This inculdes variable assignments and other things you might not think of as "commands".
EdgeVB
You can also read from $LASTEXITCODE to get the actual exit code returned by console applications.
Lunatic Experimentalist
+1  A: 

Depending on how parnoid you are and what component you are using for archiving, you can check the archive to confirm the file exixts. We use DotNetZip component to zip our archive log files (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
}
Jim Ecker