Powershell Get-EventLog -before параметр не найден

У меня есть этот фрагмент кода:

    $currentDate = get-date
    $pastDate = $currentDate.addhours(-5)


    $errorCommand = get-eventlog -Before $currentDate -After $pastDate -logname   Application -source "ESENT" 
    $errorInfo = $errorCommand | out-string

У меня есть локальный компьютер, на котором я запускаю весь сценарий, и он работает на 100% нормально. Когда я запускаю этот код в стандарте Windows Server через удаленный рабочий стол, я получаю следующее:

«Get-EventLog: не может быть найден параметр, который соответствует имени параметра 'before'» Это относится к «$ errorCommand =», и я не могу, хоть убей, понять, почему он не может найти этот параметр, это что-то неправильно настроено с моей оболочкой PowerShell. ?


person Pensai    schedule 25.06.2014    source источник
comment
Есть ли шанс, что командлет Get-EventLog был переопределен? Кто-то мог заменить встроенный командлет своей собственной функцией.   -  person    schedule 25.06.2014
comment
@iCodez Да, возможно. Когда я получаю помощь в Get-EventLog, не упоминаются параметры до или после, на самом деле многие из них, кажется, отсутствуют. Я думаю, мне нужно будет найти какой-то другой способ добиться того же эффекта с помощью моего сценария, но по-другому ... EDIT: возможно, какая-то смесь с участием -newest могла бы решить мою проблему.   -  person Pensai    schedule 25.06.2014
comment
Выполните Get-Command Get-EventLog и посмотрите, является ли ModuleName Microsoft.PowerShell.Management или, возможно, указано более одного.   -  person TheMadTechnician    schedule 25.06.2014
comment
@TheMadTechnician, сделав это, я получаю заголовки типа команды, имени и определения, никакого упоминания о Microsoft.powershell.management   -  person Pensai    schedule 25.06.2014


Ответы (1)


Похоже, что встроенная Get-EventLog была переопределена другой функцией с одно и то же имя. В нем не только отсутствуют многие стандартные параметры, но и в команде Get-Command Get-EventLog не упоминается Microsoft.Powershell.Management, как должно быть:

PS > Get-Command Get-EventLog

CommandType     Name             ModuleName                              
-----------     ----             ----------                              
Cmdlet          Get-EventLog     Microsoft.PowerShell.Management         


PS > 

Вы можете использовать New-Alias, чтобы вернуть имя исходному командлету:

$currentDate = get-date
$pastDate = $currentDate.addhours(-5)

#####################################################################
New-Alias Get-EventLog Microsoft.PowerShell.Management\Get-EventLog
#####################################################################

$errorCommand = get-eventlog -Before $currentDate -After $pastDate -logname   Application -source "ESENT" 
$errorInfo = $errorCommand | out-stringApplication -source "ESENT" 

См. Демонстрацию ниже:

PS > function Get-EventLog { 'Different' }  
PS > Get-EventLog  # This is a new function, not the original cmdlet
Different

PS > New-Alias Get-EventLog Microsoft.PowerShell.Management\Get-EventLog  
PS > Get-EventLog  # This is the original cmdlet
cmdlet Get-EventLog at command pipeline position 1
Supply values for the following parameters:
LogName: 

Хотя может быть лучше сначала выяснить, почему командлет, а затем исправить это.

person Community    schedule 25.06.2014
comment
Похоже, это ничего не изменило, мне все еще не хватает этих параметров. Было бы неплохо также отметить, что я в настоящее время являюсь стажером в компании. Я уверен, что они изменили командлет по уважительной причине, не хотели бы ничего ломать: P Я тоже новичок в PowerShell, так что простите мой идиотизм. - person Pensai; 25.06.2014
comment
Не беспокойся. Линия, которую я дал, ничего не сломает; он изменяет только имя текущего сеанса PowerShell. Кроме того, я уверен, что командлет Get-EventLog был переопределен, потому что в нем отсутствуют многие из его обычных параметров, и вы сказали, что Get-Command Get-EventLog не упомянул Microsoft.Powershell.Management, как должен. Вы поместили строку прямо над строкой, в которой вы используете Get-EventLog (см. Мою правку)? - person ; 25.06.2014
comment
Да, я правильно разместил команду. К сожалению, это просто ничего не меняет. Мне все еще говорят, что раньше не существует. Придется ли мне полностью обойти эту проблему и закодировать ее по-другому? Также может быть проблема с версией? Запуск "get-host" говорит мне, что машина в настоящее время работает под управлением 1.0.0.0. а мы до версии 4.0 нет? - person Pensai; 25.06.2014
comment
Да, при выполнении этой команды наверху заголовок «ModuelName» для меня означает «Определение» и начинается перечисление параметров, которые может принимать командлет. РЕДАКТИРОВАТЬ: Я попытаюсь обновить PowerShell на этом компьютере. - person Pensai; 25.06.2014
comment
Нашел вашу проблему: это проблема версий. Как указано здесь, PowerShell 1.0 Get-EventLog не имеет параметра -Before. Это было введено в PowerShell 2.0, как указано здесь. Итак, вам нужно либо переделать свой сценарий, чтобы не использовать Get-EventLog подобным образом, либо, если возможно, попросить начальство обновить PowerShell. :) - person ; 25.06.2014
comment
Я говорю с коллегой, я обновился до PowerShell 2.0 и, надеюсь, до 3 или 4.0, но машине требуется перезагрузка. К сожалению, эта конкретная машина делает здесь некоторые важные вещи, поэтому работа останавливается до тех пор, пока я не получу «хорошо» при перезагрузке. Спасибо, что поработали со мной iCodez, я ценю это! После того, как этот сценарий будет развернут, он избавит нас от множества неприятностей каждое утро! - person Pensai; 25.06.2014