[英]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 信息:
您的錯誤來自 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 個語句終止符。
;
換行的規則有時只是由於某些用戶使用命令的性質。 基本上意味着如果前面的文本在語法上是完整的語句,則新行被認為是語句終止。 因此,如果它不完整,則換行符將被視為空格。
快速示例:
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.