#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
команду.