首页 > 解决方案 > 语句中出现意外的令牌 - PowerShell

问题描述

我有一个在工作中运行良好的脚本,但是当我在家中运行相同的脚本来构建它时,脚本失败并出现以下错误:

Unexpected token '(' in expression or statement.
At C:\Users\MyAccount\Documents\Test.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:\temp\winevent_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 操作,但我不确定从哪里开始。

标签: powershellmethodssyntax

解决方案


您有语法问题(这意味着您的问题与您在哪台机器上运行代码无关):

  • 在PowerShell 中调用.NET 方法时,方法名称和左括号 , 之间不能有空格(,这与在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)
    

推荐阅读