当前位置: 首页 > 知识库问答 >
问题:

使用PowerShell backtick字符执行代码段不起作用

子车飞文
2023-03-14

当我在这个代码段上运行backtick(`)命令时:

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:(:)[],ParentContainerErrorRecordException FullyQualifiedErrorId:UncompleteString

目标:运行代码段并假设PC将自动跳转到下一行,因为它具有字符。

其次,当我只突出显示第一行时,通过单击行号左侧,我现在得到:

在行: 1字符: 170

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

    目标:运行代码段并假设PC将自动跳转到下一行,因为它具有字符。

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

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

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

共有2个答案

秦永望
2023-03-14

后续@Santiagos链接评论:

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

  1. 分号-
  2. 新线(有时)

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

快速示例:

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

当我添加运算符时,它期待另一个参数,这就是为什么它没有出错。

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

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

因此,你不需要那个反勾号,因为你的逗号()告诉powershell后面还有更多的内容,我们将其引用到第2段,因为它在语法上不完整。

总而言之:这是powershells端的一个错误(:

PS——很抱歉这篇长帖子,因为第一部分并不是回答你问题的必要部分;只是一些信息,可以帮助你理解它是如何结合在一起的。

编辑:

没有看到F8是这里的罪魁祸首,哈哈,感谢@briantist指出了这一点。错误不在PowerShell端。无视这篇文章(:

闻人宇定
2023-03-14

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

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

执行此操作时,会出现不完整的字符串标记错误,这是因为解析器遇到了单独的backtick`(转义字符),后面没有任何字符。这是因为行尾的换行符(backtick通常是转义的)(这就是它作为行延续字符的工作方式)丢失了,因为单行选择没有包含它。

第二,当我只突出显示第一行时,单击行号左侧

现在,在本例中,您将注意到您的选择已将光标放置在下一行的开头。这意味着这个选择包含了换行符,所以你现在有了一个完整的字符串标记。

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

问题的根源是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

这并不能解决你的选择问题,但在我看来,阅读这本书更好,而且不需要尴尬的背景。

 类似资料:
  • 此问题是由拼写错误或无法再复制的问题引起的。虽然类似的问题可能与此相关,但这个问题的解决方式不太可能帮助未来的读者。 我正在尝试向这样的代码字符串添加一些代码

  • 内建函数 eval 允许执行一个代码字符串。 语法如下: let result = eval(code); 例如: let code = 'alert("Hello")'; eval(code); // Hello 代码字符串可能会比较长,包含换行符、函数声明和变量等。 eval 的结果是最后一条语句的结果。 例如: let value = eval('1+1'); alert(value); /

  • 我有一个方法,它迭代一个映射,对值执行一个操作,并填充一个要返回的映射。 我的问题是,我如何将其转换为Java8(执行不循环的操作)? 代码:

  • 因此,下面的代码,从txt文件中取序列号作为参数,在我的计算机上正常工作。每个数字都写在一行上。下面是代码: 但它在CodeEval中不起作用。站点编译器是这么说的: Fontconfig错误:无法加载默认配置文件线程“main”java.awt.HeadLessException:未设置X11显示变量,但此程序执行了需要它的操作。在java.awt.GraphicsEnvironment.Che

  • 问题内容: 我已经测试了elasticsearch突出显示字段功能,并且工作正常。我使用了 elasticsearch2.4.4 和 spring-data- elasticsearch-2.0.0.RELEASE 我最近将 elasticsearch 升级到 5.5.0 和 spring-data-elasticsearch-3.0.0.M4 当我测试相同的代码时,突出显示不会发生 下面是示例代

  • 问题内容: 我一直在试图弄清楚为什么我按下按钮时布尔值没有改变,而当我手动改变它时却起作用了,但是它什么也没做。我试图按照教程学习这个词,但是它们不起作用。有人可以指出我要去哪里了吗? 感谢您的所有帮助,当我尝试建议的代码但没有成功时,我返回并更改了菜单。以前,我使用onClick制作了一个按钮来创建菜单,当使用代码创建图标时,我之前编写的代码可以正常工作。希望这对我以外的人有帮助,所以我不会觉得