Как подтвердить завершение предыдущей команды в 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
}