使用 PowerShell 反引号执行代码片段不起作用

Using PowerShell backtick character for snippet execution doesn't work

当我 运行 此代码段上的反引号 (`) 命令时:

Get-WmiObject win32_service | Where-Object { $_.pathname -notlike "C:\windows\*" -and $_.startmode -eq "auto" -and $_.startname -eq "localsystem"} | Select-Object displayname, `
pathname, startmode, startname | Format-List | Out-Host

我遇到了一些错误。 那些错误是什么

First,通过 按 F8 在第一行 ,我得到这个:

Incomplete string token. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : IncompleteString

Objective: 运行 片段并假设 PC 会自动跳到下一行,因为它有 `字符.

Second,当我突出显示 只是第一行 时,通过单击行号左侧,我现在得到了这个:

At line:1 char:170

  • ... to" -and $_.startname -eq "localsystem"}|Select-Object displayname, `
  •                                                                    ~ Missing expression after ',' > in pipeline element.
    
    • CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    • FullyQualifiedErrorId : MissingExpression

Objective: 运行 片段并假设 PC 会自动跳到下一行,因为它有 `字符.

但是,当我按 F5 时,它就像一个魅力。请原谅我对 PowerShell 的无知,但我在这里做错了什么?

附加信息: 这是我的 powershell 信息:

跟进@Santiagos link 评论:

这称为语句终止。使用 Powershell 时,有 2 个 语句终止符 个字符。

  1. 分号 - ;
  2. 换行符(有时)

换行符的规则只是有时是由于某些用户使用命令的方式的性质。基本上意思是,如果前面的文本句法上是一个完整的语句,换行被认为是一个语句终止。因此,如果不完整,换行符将被视为空格。

快速示例:

PS C:\Users\Abraham> 3 +
>> 4
7

当我添加 + 运算符时,它期待另一个参数,这就是它没有出错的原因。

在你的情况下,我会假设错误来自 powershells Tokenizer(词法分析器),因为它在解析你的命令时将反引号作为逗号的转义字符读取(假设它是完整的 - 因此 语句终止符 - 将下一行读取为换行符而不是空格);在我看来(如果我错了有人纠正我),我认为这是一个 False-Positive.

Backtik (`) 也称为 转义字符 可以扩展不可扩展的行。如果行中的最后一个字符是反引号,则换行符将被视为空格而不是“换行符”。

因此您不需要反引号,因为您的逗号 (,) 告诉 powershell 它后面还有更多内容,我们在第 2 段中引用了 语法 不完整。

总结一下: powershells端的错误(:

PS - 很抱歉 post,因为实际上不需要第一部分来回答您的问题;只是一些可以帮助您了解它是如何组合在一起的信息。

编辑:

没有看到 F8 是这里的罪魁祸首哈哈感谢@briantist 指出。错误不在 Powershell 端。忽略这个 post (:

您的错误来自 PowerShell ISE 的功能。

首先,您尝试在第一行使用 F8,即“运行 选择”,但没有 selection。那将隐式 select 第一行的所有字符,然后尝试 运行 那。

当您这样做时,您会收到不完整的字符串标记错误,这是因为解析器遇到了单独的反引号 `(转义字符),后面没有任何字符。那是因为行尾的换行符(反引号通常会转义)(这就是它作为行继续符的工作方式)丢失了,因为单行 selection 没有包含它。

Second, when I highlight just the first line, by clicking to the left of the line numbers

现在在这种情况下,您会注意到您的 selection 已将光标放在下一行的开头。这意味着这个 selection 确实 包括换行符,所以你现在有一个完整的字符串标记。

你的错误是你现在用逗号结束了你的命令,就好像你要传递更多的参数,然后什么都没有(其余的参数没有包含在你的 selection).


问题的根源在于 ISE 中处理 运行ing 一个 selection 的命令正是这样做的,所以如果您希望它们包含位于下一行,您也必须将它们包含在 selection 中。


附带说明一下,我可能会建议您查找可以自然使用换行符的代码元素,例如竖线 | 字符、运算符和脚本块大括号 {}

Get-WmiObject win32_service | 
    Where-Object { 
        $_.pathname -notlike "C:\windows\*" -and 
        $_.startmode -eq "auto" -and 
        $_.startname -eq "localsystem"
    } | 
    Select-Object displayname, pathname, startmode, startname | 
    Format-List | 
    Out-Host

这并没有解决您的 selection 问题,但我认为它更好读,并且不需要笨拙的反引号。