【问题标题】:How to handle command-line arguments in PowerShell如何在 PowerShell 中处理命令行参数
【发布时间】:2011-01-10 13:58:53
【问题描述】:

处理命令行参数的“最佳”方式是什么?

关于什么是“最好”的方式似乎有几个答案,因此我被困在如何处理简单的事情上:

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 command-line-arguments


    【解决方案1】:

    您正在重新发明轮子。普通 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,则要求终端输入。

    更新: 您可能还想将“标志”(布尔值 true/false 参数)传递给 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;链接中还提供 3.0 和 4.0 版本):

    【讨论】:

    • 确实,PowerShell 的一大优势在于它提供了一个易于使用的标准参数解析基础设施。
    • @naivists,来自 PowerShell 2.0 而不是 [string]$username = $(throw "-username is required."),强制参数的语法是:[Parameter(Mandatory=$true)][string]$username。以下是有关这些技术之间差异的更多信息:blogs.technet.com/b/heyscriptingguy/archive/2011/05/22/…
    • 当没有提供 arg 时要小心这个错误; powershell 只会从命令行获取任何额外的文本: .\yourscript.ps1 -server "serv" -password "mypass" 错字这会神奇地将'typo'分配给 $username。
    • 使用参数块似乎有其他意想不到的后果:stackoverflow.com/questions/40940819/…
    • @sheamus:这不是错误! Powershell 将按照给定的顺序处理和分配参数,除非使用正确的参数名称覆盖,例如,如果您的参数块列表:$user $pass $server,并且您执行 yourscript.ps1 abc,a 将是设置为 $user,b 设置为 $pass,c 设置为 $server,除非您特别指定它们!所以,如果你说:yourscript.ps1 -pass abc,$pass会被设置为a,剩下的(未命名的)参数会用来补缺的,按照参数块中列出的顺序,所以$user = b, $server = c.
    猜你喜欢
    • 1970-01-01
    • 2012-11-25
    • 2010-10-08
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多