使用 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 信息:
- 名称:Windows PowerShell ISE 主机
- 版本:5.1
跟进@Santiagos link 评论:
这称为语句终止。使用 Powershell 时,有 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 问题,但我认为它更好读,并且不需要笨拙的反引号。
当我 运行 此代码段上的反引号 (`) 命令时:
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 信息:
- 名称:Windows PowerShell ISE 主机
- 版本:5.1
跟进@Santiagos link 评论:
这称为语句终止。使用 Powershell 时,有 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 问题,但我认为它更好读,并且不需要笨拙的反引号。