处理命令行参数的“最佳”方法是什么?
似乎关于什么是“最好”的方法有几个答案,因此我被困在如何处理一些简单的事情上:
script.ps1 /n name /d domain
AND
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 (
[string]$server = "http://defaultserver",
[Parameter(Mandatory=$true)][string]$username,
[string]$password = $( Read-Host "Input password, please" )
)
在脚本中,您可以简单地
write-output $server
因为所有的参数都变成了脚本范围内可用的变量。
在这个例子中,如果脚本调用时没有使用默认值,$server将获得默认值;如果省略-username参数,脚本将停止;如果省略-password参数,则要求终端输入。
更新:
您可能还想向PowerShell脚本传递一个“flag”(一个布尔true/false参数)。例如,您的脚本可能接受“强制”,当不使用强制时,脚本以更谨慎的模式运行。
关键字是[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
指向微软相关文档的链接(适用于PowerShell 5.0;但3.0和4.0版本也可在链接):
about_Scripts
about_Functions
about_Functions_Advanced_Parameters