簡體   English   中英

PowerShell使用Start-Process在腳本塊中執行函數會使用雙引號進行奇怪的操作

[英]PowerShell Executing a function within a Script Block using Start-Process does weird things with double quotes

我有一個編輯注冊表的PowerShell腳本,所以它需要以管理員身份運行。 為此,我從運行的PowerShell腳本啟動一個新的PowerShell進程,並使用帶有函數的腳本塊傳遞部分注冊表鍵路徑。 當我在該函數中使用雙引號時,PowerShell會嘗試將它們解釋為命令,而不是字符串。 如果我使用單引號,那么一切正常。

我創建了一個簡單的樣本PowerShell腳本來重現問題。 這是片段:

$ScriptBlock = {
    function Test
    {
        $status = "This is a string"
        Write-Output $status
    }
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"

因此,在新的PowerShell流程中,它將首先在腳本塊中定義代碼,然后調用Test方法,並產生以下錯誤:

這:術語“This”不被識別為cmdlet,函數,腳本文件或可操作程序的名稱。 檢查名稱的拼寫,或者如果包含路徑,請驗證路徑是否正確,然后重試。

所以它試圖將字符串視為一個commad,就好像我剛剛輸入一樣。 This is a string ,它本身就是我腳本中的一個新行。

如果我換行

$status = "This is a string"

$status = 'This is a string'

該腳本按預期工作,只輸出字符串This is a string

我注意到的另一個奇怪的問題是,如果我不使用變量,只需使用:

Write-Output "This is a string"

然后它在一個單獨的行上輸出每個單詞,如下所示:

這個

一個

但如果我使用這樣的單引號:

Write-Output 'This is a string'

然后它按預期在一行輸出整個句子。

有人知道為什么PowerShell在這些情況下會表現得很奇怪嗎?

回答

正如TessellatingHeckler所提到的,解決方案是用雙引號,單引號包裝任何雙引號,或者你可以使用括號。

所以在我的例子中,你會改變:

$status = "This is a string"

對此:

$status = """This is a string"""

或這個:

$status = '"This is a string"'

或這個:

$status = {"This is a string"}

如果你想在你的字符串中評估一個變量(即看到變量的值),那么你必須使用雙重雙引號方法:

$status = """This is a string that evaluates $someVariable"""

仍然不確定這是一個Bug還是設計,但至少我們有一個解決方法,因為這解決了我上面描述的兩個問題。

如果我改變你的腳本

-Command $ScriptBlock

運行它,讓它打開一個新的shell窗口,然后運行

gci function:test | fl 

要在新窗口中查看函數定義,顯示的代碼是

$status = This is a string

它顯示的單引號版本具有相同的測試

$status = 'This is a string'

所以它失去了雙引號。 用雙引號來逃避它們

$status = """This is a string"""

他們來的確定。 即使scriptblocks是編譯代碼,如果你將它們擴展為字符串,它看起來像是嵌入為文本:

> $s = { "hello" }
> "---$s---"
---"hello"---

所以我認為你正在遇到這種引用問題: PowerShell從命令行參數中剝離雙引號,特別是Droj的回答,說“向外部程序發送參數的奇怪之處在於,還有更多級別的引用評估。我不知道這是不是一個bug,但我猜它不會改變,因為當你使用Start-Process並傳入參數時,行為是一樣的。“

PowerShell正在將腳本塊作為字符串擴展到您的命令中,然后將字符串周圍的單引號重新解釋為帶引號的參數,並在調用中的某處刪除。 哪個是已知問題,或者是錯誤,或者是設計,這取決於您如何閱讀該鏈接連接文章。

暫無
暫無

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

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