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也可在链接中获得):

  • about_Scripts
  • about_Functions
  • about_Functions_Advanced_Parameters
  • 链接地址: http://www.djcxy.com/p/30421.html

    上一篇: line arguments in PowerShell

    下一篇: How do I parse command line arguments in Java?