如何在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 

你正在重新发明轮子。 正常的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 

因为所有参数都成为脚本范围内可用的variables。

在这个例子中,如果脚本没有被调用, $server会得到一个默认值,如果省略了-username参数,脚本就会停止,并且如果省略-password则要求terminalinput。

更新:你可能也想把一个“标志”(布尔真/假参数)传递给PowerShell脚本。 例如,当不使用力时,脚本可能会接受一个脚本以更谨慎的模式运行的“强制”。

关键字是[switch]参数types:

  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 

如果你明确地要声明这个标志没有被设置,那么就有一个特殊的语法

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

链接到相关的Microsoft文档(对于PowerShell 5.0; tho版本3.0和4.0也可在链接中find):

  • about_Scripts
  • about_Functions
  • about_Functions_Advanced_Parameters