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

问题描述

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

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

我遇到了一些错误这些错误是什么

首先,通过按 F8 就在 第一行,我得到了这个:

不完整的字符串标记。 + CategoryInfo : ParserError: (:) [],ParentContainsErrorRecordException + FullQualifiedErrorId : IncompleteString

目标运行代码片段并假设 PC 会自动跳到下一行,因为它有 ` 字符

第二,当我突出显示仅第一行时,通过单击行号的左侧,我现在得到了:

在第 1 行字符:170

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

目标运行代码片段并假设 PC 会自动跳到下一行,因为它有 ` 字符

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

其他信息: 这是我的 PowerShell 信息:

  • 名称:Windows PowerShell ISE 主机
  • 版本:5.1

解决方法

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

首先,您尝试使用 F8,即“运行选择”,在第一行,不进行任何选择。这将隐式选择第一行的所有字符,然后尝试运行它。

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

第二,当我只突出显示第一行时,点击行号的左边

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

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

>

问题的根源在于 ISE 中处理运行选择的命令正是这样做的,因此如果您希望它们包含下一行的内容,您也必须将它们包含在选择中。


作为旁注,我可能会建议您寻找可以让您自然地使用换行符的代码元素,例如管道 | 字符、运算符和脚本块大括号 {}

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

这不能解决您的选择问题,但在我看来读起来更好,并且不需要笨拙的反引号。

,

跟进@Santiagos 链接评论:

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

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

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

快速示例:

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

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

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

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

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

总结: 这是 powershell 端的一个错误(:

PS - 很抱歉这篇长文章,因为第一部分并不是真的需要回答你的问题;只是一些可以帮助您了解它是如何组合在一起的信息。

编辑:

没有看到 F8 是罪魁祸首,谢谢@briantist 指出。错误不在 Powershell 端。忽略这篇文章 (: