处理命令行参数的“最佳”方法是什么?
似乎对“最佳”方式有几个答案,因此我不知道如何处理如下简单的事情:
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
答案 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):