【问题标题】:Using PowerShell backtick character for snippet execution doesn't work使用 PowerShell 反引号字符执行代码段不起作用
【发布时间】:2021-07-25 11:57:55
【问题描述】:

当我在这个 sn-p 上运行反引号 (`) 命令时:

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 : 不完整字符串

目标运行 sn-p 并假设 PC 会自动跳到下一行,因为它有 ` 字符

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

在 line:1 char:170

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

目标运行 sn-p 并假设 PC 会自动跳到下一行,因为它有 ` 字符

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

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

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

【问题讨论】:

  • Select-Object 语句中不需要 `。
  • 查看此内容可帮助您了解为什么在这种情况下不需要反引号。 stackoverflow.com/questions/3235850/…
  • @santiago 总是第一个到现场!大声笑
  • @SantiagoSquarzon 谢谢。从现在开始,我会牢记在心。
  • @Birdie 我看到您得到了一些有用的答案 :) 这些是我们在您每天使用 PowerShell 时学到的一些小知识。我想在学习任何脚本/编程语言时都可以这样说。

标签: windows powershell windows-10 powershell-ise powershell-5.1


【解决方案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

这并不能解决您的选择问题,但我认为它更易于阅读,并且不需要笨拙的反引号。

【讨论】:

  • 啊啊啊啊啊啊啊啊啊啊啊啊啊!甚至没有注意到(:假设两次都是 F5 哈哈
  • 作为旁注,在 PS Core 上,唯一的反引号不会抛出,我不知道,但它也不会返回任何内容,例如:Get-Process|Select-Object CPU, `
  • 有趣的发现@SantiagoSquarzon!
【解决方案2】:

跟进@Santiagos 链接评论:

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

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

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

快速示例:

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

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

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

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

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

总结一下: 这是powershells end上的一个错误(:

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

编辑:

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

【讨论】:

  • 愚蠢的我。感谢您的回复。
  • 在这种情况下,PowerShell 的解析器没有问题,问题在于“运行选择”并将不完整的选择传递给 PowerShell(的解析器)。
  • 很好地抓住了F8 选择@briantist。所以这毕竟不是错误(:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多