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
因为所有参数都成为脚本范围内可用的变量。
在这个例子中,如果在没有它的情况下调用脚本, $server
将获得默认值,如果省略-username
参数,并且在省略-password
情况下请求终端输入,则脚本将停止。
更新:你可能想要传递一个“标志”(布尔真/假参数)到PowerShell脚本。 例如,当不使用力时,脚本可能会接受脚本以更谨慎的模式运行的“强制”。
关键字是[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"
}
现在,在调用脚本时,您可以像这样设置开关/标志参数:
.yourscript.ps1 -server "http://otherserver" -force
如果您明确表示该标志未设置,那么就有一个特殊的语法
.yourscript.ps1 -server "http://otherserver" -force:$false
有关Microsoft文档的链接(对于PowerShell 5.0; tho版本3.0和4.0也可在链接中获得):