Как подтвердить завершение предыдущей команды в powershell

У меня есть простая powershell script, которая запускается ежедневно, чтобы сжать и переместить некоторые файлы журналов. Как я могу проверить, что команда успешно завершена, прежде чем удалять исходный файл журнала.

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

Если элемент Move-Item завершен нормально, я хочу удалить элемент $source_file

Ответ 1

Состояние завершения предыдущей команды можно получить через специальную переменную $?.

Обратите внимание, что это лучше всего работает с ошибками без прерывания (например, вы получите от Move-Item). Завершающие ошибки являются результатом прямого throw или исключения, получаемого в .NET, и они изменяют поток вашего кода. Лучше всего использовать инструкцию trap или try/catch для наблюдения за этими типами ошибок.

Еще одна вещь, которая должна следить за WRT $? и консолью exes, заключается в том, что PowerShell предполагает, что код выхода 0 означает успех (т.е. $? установлен на $true), а все остальное означает отказ ($? set до $false). К сожалению, не все консольные exe наблюдают, что правило выхода кода, например. могут быть несколько кодов успеха и один код отказа (0). Для тех exes, которые не соответствуют правилам кода выхода, используйте $LastExitCode, как указано в комментариях, чтобы определить успех или неудачу.

Ответ 2

В зависимости от того, насколько вы парноид и какой компонент вы используете для архивации, вы можете проверить архив, чтобы подтвердить файл exixts. Мы используем компонент DotNetZip для архивирования архивных файлов архива (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
}