使用PowerShell反引号字符执行片段无法正常工作。
使用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
+ FullyQualifiedErrorId : 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
继续 @Santiagos 的链接评论:
这被称为语句终止符。在使用PowerShell时有两个语句终止字符。
- 分号 -
;
- 换行符(有时)
换行符的规则只有在一些用户使用命令的情况下才可能存在,基本上意味着如果前面的文本在语法上是完整的语句,则换行符被视为语句终止符。 因此,如果不完整,则将换行符视为空格。
快速的例子:
PS C:\Users\Abraham> 3 + >> 4 7
当我添加了+
运算符时,它期望有另一个参数,这就是为什么它没有出错的原因。
在您的情况下,我将认为错误来自PowerShell的Tokenizer(词法分析器),当解析您的命令时,它将反引号视为逗号的转义字符(假设它是完整的-因此是语句终止符-将下一行视为换行符而不是空格); 在我看来(请纠正我),我认为这是一个误报的错误。
反引号(`)也被称为转义字符,可以延长不可扩展的行。如果行中最后一个字符是反引号,则换行符将被视为空格而不是“换行符”。
所以由于逗号(,
)告诉PowerShell后面还有更多内容,所以您不需要那个反引号,我们在第2段引用了这句话,因为它在语法上是不完整的。
总之:这是PowerShell的问题:
PS-对不起,由于第一部分并不是真正回答您的问题所需要的内容,只是可以帮助您了解它是如何组合的一些信息,因此帖子有些长。
编辑:
没看见F8
是元凶,lol,感谢@briantist指出。 错误不在PowerShell端。 请忽略这个帖子(:
您的错误来自于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
虽然这不能解决您的选择问题,但我认为它更易读,不需要笨拙的反斜杠。