Powershell Get-EventLog возвращает события по одному за раз

#powershell #powershell-remoting

#powershell #powershell-удаленное управление

Вопрос:

РЕДАКТИРОВАТЬ 26.09.2011: Все еще ищу ответ, если у вас есть какие-либо идеи, пожалуйста, опубликуйте и дайте мне знать!

Краткое описание проблемы

Когда я запускаю Get-EventLog на своем собственном компьютере или на соседнем компьютере, я не вижу ничего необычного, и все работает, как ожидалось.

Когда я запускаю его на компьютере, который находится дальше (средний ping 108ms ), он начинает действовать так, как я бы не ожидал. Между каждым возвращаемым событием возникает длительная пауза, и для завершения требуется чрезмерно много времени.

Вот команда, которую я использую:

 Get-EventLog -ComputerName [computername] -LogName Application -newest 100
  

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

Когда я выполняю команду обычным образом и использую что-то вроде онлайн-секундомера для приблизительных измерений, результат составляет около 4 минут и 3 секунд.

Когда я измеряю это с помощью:

 Measure-Command {Get-EventLog -ComputerName yanhong03 -LogName Application -newest 100}
  

Результат составляет около 31 секунды (но ни одна информация не распечатывается).

Итак, два вопроса:

  • Почему события (по-видимому) извлекаются по одному за раз?
  • Почему использование Measure-Command фактически изменяет время, необходимое команде для завершения?

Разные подробности:

Я запускаю powershell v2 и использую оболочку в ISE Powershell для выполнения этих команд. Операционная система — Windows XP.

Комментарии:

1. Я только что заметил, что не ответил ни на один из ваших вопросов и, честно говоря, могу только догадываться. Я думаю, что удаленная выборка этой информации — это просто неэффективный вариант, когда просто более эффективно указывать удаленному компьютеру выполнить работу и просто отправить ее обратно (мой пример). Я подозреваю, что measure-command маскирует время, потерянное при отображении результата, и возвращается для другого перехода, и, возможно, позволяет удаленному компьютеру продолжать передавать результаты.

2. Все в порядке, спасибо, что предоставили альтернативный способ их получения! Меня все еще интересуют конкретные ответы на эти вопросы, поэтому я пока оставлю вопрос открытым, но я ценю информацию.

Ответ №1:

Поскольку вы используете PowerShell 2, вы можете воспользоваться преимуществами удаленного взаимодействия.

Попробуйте это:

 Invoke-Command -ComputerName atliis03 -ScriptBlock { Get-EventLog -LogName Application -newest 100 }
  

Если вы используете много серверов, возможно, вам захочется запустить процесс в качестве фонового задания:

 $job = Invoke-Command -ComputerName atliis03 -ScriptBlock { Get-EventLog -LogName Application -newest 100 } -AsJob
  

Затем вы можете вернуться и получить результаты:

 Receive-Job $job
  

Команда Get-Job покажет вам статус всех запущенных заданий.

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

Комментарии:

1. Это определенно очень хорошо работающая альтернатива, так что спасибо вам за это! Для всех, кто еще читает это и является новичком в Powershell, как я, вам нужно будет сделать две вещи на целевой машине, чтобы заставить это работать: сначала установите powershell, затем запустите Enable-PsRemoting команду.