簡體   English   中英

使用 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

我得到一些錯誤。 這些錯誤是什么?

首先,通過在第一行按 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

您的錯誤來自 PowerShell ISE 的功能。

首先,您嘗試在第一行使用F8 ,即“運行選擇”,但未進行任何選擇。 這將隱含 select 第一行的所有字符,然后嘗試運行它。

當你這樣做時,你會得到不完整的字符串標記錯誤,這是因為解析器遇到了唯一的反引號` (轉義字符),它后面沒有字符。 那是因為缺少行尾的換行符,反引號通常是 escaping (這就是它作為續行字符的工作方式),因為單行選擇不包括它。

其次,當我只突出顯示第一行時,通過單擊行號的左側

現在在這種情況下,您會注意到您的選擇已將 cursor 放在下一行的開頭 這意味着此選擇確實包含換行符,因此您現在擁有一個完整的字符串標記。

你的錯誤是你現在用逗號結束你的命令,好像你要傳遞更多的參數,然后什么都沒有(參數的 rest 不包括在你的選擇中)。


問題的根源在於 ISE 中處理運行選擇的命令正在執行此操作,因此如果您希望它們包含下一行的內容,則必須將它們也包含在選擇中。


作為旁注,我可能會建議您尋找可以讓您自然地使用換行符的代碼元素,例如 pipe | 字符、運算符和腳本塊大括號{}

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 個語句終止符

  1. 分號 - ;
  2. 換行符(有時)

換行的規則有時只是由於某些用戶使用命令的性質。 基本上意味着如果前面的文本在語法上是完整的語句,則新行被認為是語句終止。 因此,如果它不完整,則換行符將被視為空格。

快速示例:

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

當我添加+運算符時,它期待另一個參數,這就是它沒有出錯的原因。

在您的情況下,我將假設錯誤來自 powershells Tokenizer(詞法分析器)在解析您的命令時,因為它會將您的反引號讀取為逗號的轉義字符(假設它是完整的 - 因此是語句終止符- 讀取下一行作為換行符而不是空格); 在我看來(如果我錯了,有人糾正我),我認為這是一個錯誤,它是一個False-Positive

Backtik (`) 也稱為轉義字符,可以擴展不可擴展的行。 如果行中的最后一個字符是反引號,則換行符將被視為空格而不是“換行符”。

所以你不需要那個反引號,因為你的逗號 ( , ) 告訴 powershell 后面還有更多內容,我們參考第 2 段的語法不完整。

總而言之:這是 powershells end(:

PS - 很抱歉這篇文章很長,因為第一部分並不是真正需要回答你的問題; 只是一些可以幫助您了解它如何組合在一起的信息。

編輯:

沒有看到F8是這里的罪魁禍首,哈哈,感謝@briantist 指出了這一點。 錯誤不在 Powershell 端。 無視這篇文章(:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM