如何在PowerShell中处理命令行参数

时间:2010-01-28 20:01:10

标签: powershell command-line-arguments

处理命令行参数的“最佳”方法是什么?

似乎对“最佳”方式有几个答案,因此我不知道如何处理如下简单的事情:

script.ps1 /n name /d domain

script.ps1 /d domain /n name.

是否有可以更好地处理此问题的插件?我知道我在这里重新发明轮子。

显然我已经不是很漂亮而且肯定不是“最好的”,但它确实有效..而且它是UGLY。

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

1 个答案:

答案 0 :(得分:785)

你正在重新发明轮子。正常的PowerShell脚本具有以-开头的参数,如script.ps1 -server http://devserver

然后在文件开头的param部分处理它们。

您还可以为参数指定默认值,如果不可用则从控制台读取它们或停止脚本执行:

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

在脚本中你可以简单地

write-output $server

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

在此示例中,如果在没有脚本的情况下调用脚本,$server将获取默认值,如果省略-username参数,脚本将停止,如果省略-password则请求终端输入

更新: 您可能还想将“flag”(布尔值true / false参数)传递给PowerShell脚本。例如,你的脚本可能会接受一个“强制”,当不使用force时,脚本会以更小心的方式运行。

关键字是[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"
}

现在,在调用脚本时,您需要设置switch / flag参数,如下所示:

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

如果您明确要声明未设置该标志,则该

有一种特殊语法
.\yourscript.ps1 -server "http://otherserver" -force:$false

指向相关Microsoft文档的链接(适用于PowerShell 5.0;链接中也提供了版本3.0和4.0):