Как подтвердить завершение предыдущей команды в powershell - PullRequest
10 голосов
/ 16 сентября 2010

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

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

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

Ответы [ 2 ]

22 голосов
/ 16 сентября 2010

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

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

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

1 голос
/ 16 сентября 2010

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