如何在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
因为所有参数都成为脚本范围内可用的variables。
在这个例子中,如果脚本没有被调用, $server
会得到一个默认值,如果省略了-username
参数,脚本就会停止,并且如果省略-password
则要求terminalinput。
更新:你可能也想把一个“标志”(布尔真/假参数)传递给PowerShell脚本。 例如,当不使用力时,脚本可能会接受一个脚本以更谨慎的模式运行的“强制”。
关键字是[switch]
参数types:
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也可在链接中find):
- about_Scripts
- about_Functions
- about_Functions_Advanced_Parameters