Скрипт PowerShell - Как обработать результат выполненной команды - PullRequest
4 голосов
/ 04 декабря 2009

У меня есть небольшой скрипт, который копирует файлы в список удаленных машин. В этом скрипте я использую:

Copy-Item "$AppLocation\$AppName" -destination "\\$MachineName\c$\" -force

Это может привести к различным типам ошибок. Если это приводит к ошибке, я хочу записать ошибку в файл, а затем продолжить. Мой вопрос заключается в том, что я хотел бы знать, как правильно определить, была ли команда Copy-Item успешной.

Следующий вопрос связан:

psexec \\$MachineName -u $RemoteLogin -p $Remotepassword -s -i -d C:\$AppName

Что было бы хорошим способом узнать, как выполнялась эта команда? Я получаю сообщение в консоли, что оно завершено с 0, но я понятия не имею, как мне получить код возврата в локальную переменную.

Я также могу использовать это:
(Get-WMIObject -ComputerName $MachineName -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install("C:\$AppName","","false")
который работает нормально, но все же, я не знаю, как выяснить, удалось ли это, если я не прочитал вывод.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 22 июня 2012

Используйте Попробуйте и поймайте, как следует

$ErrorActionPreference='Stop'
Try{
Write-Host "Finished OK"
}
Catch [system.exception]
{
    Write-Host "Finished with Error"
    Write-Host $_.Exception.ToString()
    exit -1
}
2 голосов
/ 04 декабря 2009

Что касается первой части вашего вопроса, вы можете использовать

Copy-Item ... -ErrorAction Continue -ErrorVariable yourVariable

Действие ошибки указывает командлету, что делать, если в случае ошибки ErrorVariable поместит любую ошибку в выбранную вами переменную ($ yourVariable в примере).

$? автоматическая переменная содержит статус выполнения последней операции. Если это неверно, просто проверьте содержимое $ yourVariable, чтобы узнать, что пошло не так, и сделайте с ним все, что хотите (например, запишите это в файл в вашем случае).

Вы также можете использовать

Copy-Item ... -ErrorAction Continue 2> [pathToLogFile]

Это перенаправит поток ошибок командлета в файл по вашему выбору ...

Относительно второй части вашего вопроса: $ LASTEXITCODE содержит код возврата вашего последнего исполняемого файла.

Рассматривали ли вы возможность использования возможностей удаленного взаимодействия в Powershell 2 для большего контроля?

Надеюсь, это поможет

Седрик

1 голос
/ 04 декабря 2009

Есть много вопросов на ваши вопросы.

Вот что я сделал, чтобы прочитать результаты консольных приложений, таких как psexec:

    [System.Diagnostics.ProcessStartInfo]$info = New-Object System.Diagnostics.ProcessStartInfo
    $info.WorkingDirectory = "C:\"
    $info.UseShellExecute = $false
    $info.RedirectStandardOutput = $true 
    $info.CreateNoWindow = $true
    [System.Diagnostics.Process]$proc = [System.Diagnostics.Process]::Start($info)

    if (($proc -ne $null) -and ($proc.id -ne 0)) { [void]$proc.WaitForExit($timeOutMs); }
    $proc.StandardOutput.ReadToEnd();

Обратите внимание, что это непроверенный код, но он получен из чего-то, что работает, и я просто немного редактировал для простоты.

Теперь вы можете обрабатывать вывод текста psexec и обрабатывать его соответствующим образом.

0 голосов
/ 04 декабря 2009

Я использую скрипт powershell для удаления старых файлов. Это выводит сообщение на экран, который может так же легко записать сообщение в журнал событий. Подробности здесь .

Запись в журнал событий может быть выполнена с помощью команды Write-EventLog. Хорошие подробности об этом на MSDN и TechNet . Для этой информации в поисковых системах появляется огромное количество информации .

...