2014-03-06 63 views
3

是否可以將引號保留在$args

腳本被稱爲像這樣:

.\test1.ps1 a=application o="this object" msg_text="this is a text" 

的引號是強制進行進一步的處理。有沒有辦法讓他們在$args

+0

將這些字符串總是需要引用? – mjolinor

回答

2

我不能修改輸入參數,我能想到的唯一方法仍然需要修改有些叫做的命令。

爲了保留引號,可能嘗試捕獲調用PowerShell腳本的完整命令行。

所以我把這個在test1.ps1腳本:

Write-Host (Get-WmiObject -Query "select CommandLine from Win32_Process where CommandLine like '%test1%'").CommandLine 

那麼這是,如果調用腳本時以這種方式返回什麼:

PS C:\temp> powershell .\test1.ps1 a=application o="this object" msg_text="this is a text" 
"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" .\test1.ps1 a=application "o=this object" "msg_text=this is a text" 

這是如果只可能然而,PowerShell的新實例被調用,否則參數將無法通過此方法獲得:

PS C:\temp> .\test1.ps1 a=application o="this object" msg_text="this is a text" > zzz3.txt 

PS C:\temp> 

當然,如果採取這種方法,則需要手動解析輸入參數,您可以在$args對象的幫助下執行此操作。這是一個長時間的投籃,但確實保留了引號。

+0

看到上面的評論;)不幸的是我沒有影響參數是如何格式化的 – user3322838

+0

我修改了答案以從WMI獲取完整的命令行。這是一個長遠的目標,但可能會使你朝正確的方向發展。 – CJBS

2

可以逃避在PowerShell中的報價與反引號:

.\test1.ps1 a=application o="`"this object`"" msg_text="`"this is a text`"" 

你可以單引號(反之亦然)內還嵌套雙引號,但要注意的是變量不與單引號分隔的字符串進行評估。

.\test1.ps1 a=application o='"this object"' msg_text='"this is a text"' 

此外,爲什麼要使用$args?爲什麼不使用強大的內置參數系統?

延伸閱讀:

Get-Help About_Quoting_Rules

Stack Overflow - How to Handle Command Line Arguments in PowerShell

TechNet Magazine - Windows PowerShell: Defining Parameters

+0

我試圖使用內置系統,但我只提供腳本,並沒有影響如何格式化參數 – user3322838

+1

+1這是一個很好的答案,更詳細說明我的(在附加引用和Powershell的腳本參數方面的功能。我會根據不能修改腳本輸入的額外要求刪除/替換我的答案。 – CJBS

+1

@CJBS我沒有看到你的答案,直到我發佈了我的帖子(我認爲我們發佈了一兩分鐘每個其他)+1對你的新答案,我認爲這是一個相當聰明的方法OP的問題。 – Nacimota