2009-12-04 3 views
4

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

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")
, который прекрасно работает, но до сих пор, не знаю, как узнать, если это удалось, если я не прочитал вывод.

Спасибо!

+0

любого полного образцу с источником информации об этом? – Kiquenet

ответ

2

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

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

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

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

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

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

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

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

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

Надеется, что это помогает

Седрику

+1

Блестящий! Большое спасибо. Используя полномочия google, я узнал больше о ErrorVariable, и теперь я использую его следующим образом: $ err = @() Copy-Item ... -ErrorAction Continue -ErrorVariable + err Это работает очень хорошо. – flayn

+1

Если вы считаете, что вам не нужно инициализировать переменную, прежде чем использовать ее для этого. Рассмотрите возможность чтения общих параметров, автоматических переменных и конкретных переменных, таких как $ ErrorActionPreference: это поможет вам –

1

На ваш вопрос много вопросов.

Вот то, что я сделал, чтобы прочитать результаты из консольных приложений, как 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 и handle соответственно.

0

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

Запись в журнал событий может быть выполнена с помощью команды Write-EventLog. Хорошие сведения об этом on MSDN и TechNet. Для этого загружаются данные in the search engines.

2

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

$ErrorActionPreference='Stop' 
Try{ 
Write-Host "Finished OK" 
} 
Catch [system.exception] 
{ 
    Write-Host "Finished with Error" 
    Write-Host $_.Exception.ToString() 
    exit -1 
} 
Смежные вопросы