问题描述
当我在此代码段上运行反引号 (`) 命令时:
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 个语句终止符字符。
- 分号 -
;
- 换行(有时)
换行的规则有时只是由于某些用户使用命令的方式的性质。基本上意味着如果前面的文本在语法上是一个完整的语句,则新行被视为语句终止。因此,如果它不完整,则换行符将被视为空格。
快速示例:
PS C:\Users\Abraham> 3 +
>> 4
7
当我添加 +
运算符时,它期待另一个参数,这就是它没有出错的原因。
在您的情况下,我将假设错误来自 powershells Tokenizer(词法分析器)在解析您的命令时,因为它读取您的反引号作为转义字符你的逗号(假设它是完整的——因此是语句终止符——将下一行读作换行符而不是空格);在我看来(如果我错了,有人会纠正我),我认为这是一个误报的错误。
Backtik (`) 也称为 转义字符 可以扩展不可扩展的行。如果行中的最后一个字符是反引号,则换行符将被视为空格而不是“换行符”。
因此您不需要那个反引号,因为您的逗号 (,
) 告诉 powershell 在它之后还有更多内容,我们在语法上引用了第二段不完整。
总结: 这是 powershell 端的一个错误(:
PS - 很抱歉这篇长文章,因为第一部分并不是真的需要回答你的问题;只是一些可以帮助您了解它是如何组合在一起的信息。
编辑:
没有看到 F8
是罪魁祸首,谢谢@briantist 指出。错误不在 Powershell 端。忽略这篇文章 (: