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

How to handle command-line arguments in PowerShell

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

似乎对于"最好"的方式有几个答案,因此,我一直坚持如何处理简单的事情,如:

1
script.ps1 /n name /d domain

1
script.ps1 /d domain /n name.

有没有一个插件可以更好地处理这个问题?我知道我在这里重新发明轮子。

显然,我已经拥有的并不漂亮,当然也不是"最好的",但它是有效的。而且很难看。

1
2
3
4
5
6
7
8
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部分处理它们。

您还可以为参数分配默认值,如果不可用,则从控制台读取这些值,或者停止脚本执行:

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

在脚本中,您可以简单地

1
write-output $server

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

在本例中,如果不调用脚本,则$server将获取默认值;如果省略-username参数,则脚本将停止;如果省略-password参数,则请求终端输入。

更新:您也可以向PowerShell脚本传递"flag"(布尔型真/假参数)。例如,当不使用force时,脚本可以接受"force",在这种情况下,脚本以更谨慎的模式运行。

关键字是[switch]参数类型:

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

在脚本中,您可以这样处理它:

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

现在,在调用脚本时,您可以这样设置switch/flag参数:

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

如果您显式地想要声明没有设置标志,那么有一个特殊的语法来说明这一点。

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

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

  • 关于脚本
  • 关于函数
  • 关于u函数u高级u参数