Ошибка PowerShell при использовании GetEventLog CmdLet

Я пытаюсь запустить сценарий PowerShell и попытаться отфильтровать сообщение.

param($server, $message)
Try
{
    Invoke-Command -computername $server {Get-Eventlog -logname application -source "source" -message $message | Format-List}
}
Catch [Exception]
{
    Write-Host $_.Exception.ToString()
}

Я пытаюсь запустить скрипт со следующими параметрами:

GetEventLog.ps1 "SERVERNAME" "TEXT_TO_FIND"

не может проверить аргумент параметра «Сообщение». Аргумент нулевой или пустой. Укажите аргумент, который не является нулевым или пустым, а затем повторите команду. + CategoryInfo: InvalidData: (:) [Get-EventLog], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetEventLogCommand

По какой-то причине он отлично обрабатывает параметр $server, но если жалуется на переменную $message.

Как я могу это исправить?


person Maverick    schedule 13.04.2012    source источник
comment
Get-EventLog такой медленный!!. Я закончил использовать это.. Get-WinEvent -computername $server -FilterHashTable @{LogName='application';providername=$provider} | Where-Object {$_.Message -match $message -And $_.TimeCreated -ge $after -And $_.TimeCreated -le $before}   -  person Maverick    schedule 18.04.2012


Ответы (3)


Вы можете получить события без Invoke-Command:

Get-EventLog -ComputerName $server -LogName application -source "source" -message $message

В случае, если команда генерирует ошибку, вы не сможете ее отловить, поскольку, вероятно, это не будет завершающей ошибкой. Чтобы ошибка завершилась, используйте параметр ErrorAction:

   Get-EventLog -ComputerName $server -LogName application -ErrorAction Stop ...
person Shay Levy    schedule 13.04.2012

Попробуйте так:

Invoke-Command -computername $server {Get-Eventlog -logname application -source "source" -message $args[0] | Format-List} -ArgumentList $message
person CB.    schedule 13.04.2012
comment
Это не правильное решение, как у @ShayLevy, но в любом случае оно устраняет ошибку, которую вы опубликовали. - person CB.; 14.04.2012

Вам нужно будет передать $message в качестве аргумента, используя параметр -ArgumentList. Посмотрите пример 9 справочной страницы:

Invoke-Command

invoke-command -computername server01 -scriptblock {param($log, $num) get-eventlog -logname $log -newest $num} -ArgumentList $MWFO_Log, 10
person Andy Arismendi    schedule 13.04.2012
comment
Нужно попробовать это, но определенно не так ясно и просто, как ответ Шей Леви. Зачем мне использовать блок скриптов? Думаю, если бы я не использовал команду вызова, мне бы не понадобился этот подход. :) - person Maverick; 14.04.2012
comment
@Maverick Да, так получилось, что командлет Get-EventLog уже поддерживает удаленное выполнение, поэтому нет необходимости использовать Invoke-Command. - person Andy Arismendi; 14.04.2012