2010-01-28 85 views
323

什麼是處理命令行參數的「最佳」方式?如何在PowerShell中處理命令行參數

好像有什麼「最好」的方式是,因此我堅持就如何處理,因爲簡單的東西幾個答案:

script.ps1 /n name /d domain 

script.ps1 /d domain /n name. 

有沒有可以更好地處理這個問題的插件?我知道我在這裏重新發明輪子。

很明顯,我已經不是很漂亮,當然不是「最好的」,但它的工作原理..它是醜陋的。

for ($i = 0; $i -lt $args.count; $i++) { 
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]} 
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]} 
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]} 
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]} 
} 
Write-Host $strName 
Write-Host $strDomain 

回答

604

您正在重新發明輪子。普通PowerShell腳本具有參數開始-,像script.ps1 -server http://devserver

然後你處理它們在param節中的文件的開頭(參見教程:https://devcentral.f5.com/articles/powershell-abcs-p-is-for-parameters

您也可以默認值分配給您的參數,可以閱讀從控制檯如果不可用或者停止執行腳本:

param (
    [string]$server = "http://defaultserver", 
    [Parameter(Mandatory=$true)][string]$username, 
    [string]$password = $(Read-Host "Input password, please") 
) 

在腳本中,你可以簡單地

write-output $server 

因爲所有參數都成爲腳本範圍內可用的變量。

在這個例子中,$server獲得一個默認值,如果調用腳本時沒有它,腳本將停止,如果你省略-username參數並要求端子輸入如果省略-password

更新: 您可能希望將「標誌」(布爾真/假參數)傳遞給PowerShell腳本。例如,當不使用力時,腳本可能會接受腳本以更謹慎的模式運行的「強制」。

該關鍵字是[switch]參數類型:

param (
    [string]$server = "http://defaultserver", 
    [string]$password = $(Read-Host "Input password, please"), 
    [switch]$force = $false 
) 

劇本里面,那麼你會用它的工作是這樣的:

if ($force) { 
    //deletes a file or does something "bad" 
} 

現在,調用腳本的時候你會設置開關/標誌參數是這樣的:

.\yourscript.ps1 -server "http://otherserver" -force 

如果你明確想要st吃的標誌沒有設置,存在對

.\yourscript.ps1 -server "http://otherserver" -force:$false 

鏈接到相關Microsoft文檔(用於PowerShell的5.0的特殊語法;版本3.0和4。0也可在鏈接):

+5

真棒!而且很有趣,因爲我最初嘗試使用param但偏離它,因爲我無法弄清楚語法。大聲笑謝謝! – 2010-01-28 20:24:01

+33

確實,PowerShell的一大優點是它提供了一個易於使用的標準參數解析基礎設施。 – 2010-01-28 20:43:54

+0

在命令行示例中有「-site」,並且它與腳本中的「[string] $ server」不匹配 這是一個錯字嗎? – JasDev 2012-10-27 16:53:20