[英]PowerShell Start-Process loses precision on number passed as a string to a function
[英]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.