处理命令行参数的“最佳”方法是什么?
关于“最好的”方法是什么,似乎有几个答案,结果我被困在如何处理像这样简单的事情上:
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
发布于 2010-01-29 04:13:41
你在重新发明轮子。正常的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
,则脚本将请求终端输入。
更新:您可能还想向PowerShell脚本传递一个“标志”(布尔值为真/假的参数)。例如,您的脚本可能会接受一个" force“,当不使用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
指向相关微软文档的链接(适用于PowerShell 5.0;也可以在链接中找到3.0和4.0版):
https://stackoverflow.com/questions/2157554
复制相似问题