Неожиданный токен в инструкции — PowerShell

#powershell #methods #syntax

Вопрос:

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

 Unexpected token '(' in expression or statement.
At C:UsersMyAccountDocumentsTest.ps1:34 char:54
  $Log = [Microsoft.VisualBasic.Interaction]::InputBox ('Enter the Even ...
Unexpected token '(' in expression or statement.
      CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
      FullyQualifiedErrorId : UnexpectedToken
 

Вот код, который я пытаюсь запустить:

 $log = [Microsoft.VisualBasic.Interaction]::InputBox ('Enter the Event ID you are looking for.', 'Event ID Query')
cd C:tempwinevent_logs
$List = Get-ChildItem | Where-Object {$_.FullName -match "security"} | Select-Object
Get-WinEvent -FilterHashtable @{path=$List;id=$Log} | Measure-Object | Select-Object count
 

Я предполагаю, что в моей домашней системе есть проблема с конфигурацией, которая не интерпретирует операции Visual Basic, но я не уверен, с чего начать.

Ответ №1:

Вы ставите пробел между InputBox и ('Enter . Удалите пробел, чтобы он выполнялся как метод с аргументами:

 $log = [Microsoft.VisualBasic.Interaction]::InputBox('Enter the Event ID you are looking for.', 'Event ID Query')
 

В противном случае вы пытаетесь сказать PowerShell, чтобы он вернул сам объект метода, и он не знает, что делать с полученным подвыражением в круглых скобках.

Ответ №2:

У вас проблема с синтаксисом (это означает, что ваша проблема не связана с тем, на какой машине вы запускаете свой код):

  • При вызове методов .NET в PowerShell между именем метода и открывающей скобкой не должно быть пробела, ( в отличие от C#, где это разрешено.

Использование [string] .ToUpper() метода экземпляра типа в качестве простого примера:

 # OK - no space between 'ToUpper' and '('
PS> 'foo'.ToUpper()
FOO

# BROKEN - space before '('
PS> 'foo'.ToUpper ()

ParserError:
Line |
   1 |  'foo'.ToUpper ()
     |                ~
     | Unexpected token '(' in expression or statement.
 

Примечание:

  • С ошибочным пробелом PowerShell интерпретирует то, что следует за пробелом ( () в данном случае), как отдельное выражение, что нарушает синтаксис, учитывая, что разделенный пробелом список выражений (которые не связаны с операторами) недопустим; например, 1 2 вызывает ту же ошибку.
  • В стороне: исключение () того, что в противном случае было бы вызовом метода — например, 'foo'.ToUpper — служит полезной цели в PowerShell: оно отображает информацию об отражении, а именно сигнатуры (список параметров и их типов) метода и его перегрузок; например:
     OverloadDefinitions
    -------------------
    string ToUpper()
    string ToUpper(cultureinfo culture)