【问题标题】:Powershell: Colon in commandlet parametersPowershell:命令行参数中的冒号
【发布时间】:2012-01-21 11:20:25
【问题描述】:

需要冒号的 Powershell 命令行开关参数是怎么回事?

考虑 Exchange 2010 管理外壳 cmdlet Move-ActiveMailboxDatabase。 Confirm 开关是System.Management.Automation.SwitchParameter,必须像这样使用,

Move-ActiveMailboxDatabase -Confirm:$false

如果没有冒号,命令将无法像这样识别不确认开关,

Move-ActiveMailboxDatabase -Confirm $false

这是为什么呢?结肠在那里有什么不同?为什么 Exchange2010 似乎是我唯一注意到这种行为的事情?

我浏览了 Powershell in Action 和 Powershell 2.0,但没有找到任何关于此语法的信息。范围解析和 .Net 对象访问使用记录在这些书中。

我的 Google-fu 发现了一个 article,它声称它明确转发开关参数值,但未能解释这是关于什么的。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    当你这样做时:

    Move-ActiveMailboxDatabase -Confirm $false
    

    你不是说Confirm 参数接受$false。您说的是-Confirm,并且还将一个(单独的)参数传递给值为$false 的cmdlet。

    由于Confirm 是一个开关,所以-Confirm 的存在就意味着它是真的。没有-Confirm 意味着它是错误的。

    让我给你一个脚本示例:

    param([switch]$test)
    
    write-host Test is $test
    

    如果你只是运行没有任何参数/参数的脚本,即.\script.ps1,你会得到输出:

    Test is False
    

    如果你以.\script.ps1 -test运行它,输出是

    Test is True
    

    如果你以.\script.ps1 -test $false运行,输出为

    Test is True
    

    如果你以.\script.ps1 -test:$false 运行它,输出是

    Test is False
    

    在开关变量本身的值必须从另一个变量中确定的情况下使用:

    例如,考虑脚本:

    param ([boolean]$in)
    
    function func([switch] $test){
    write-host Test is $test
    }
    
    func -test:$in
    

    如果你以.\script.ps1 -in $false 运行它,你会得到

    Test is false
    

    如果您无法使用:,则必须将其写为:

    if($in){  func -test}
    else { func }
    

    【讨论】:

    • 不是完整的答案 - 我不知道邮箱示例,但在许多其他情况下(例如Set-SMBServerConfiguration),-Confirm:$false 的效果与它的缺失不同。我可以使用-Confirm:$false-Force,否则需要确认。
    【解决方案2】:

    冒号可以与每个参数值一起使用,但在切换参数的情况下更为特殊。开关参数不带值,它们要么存在($true)要么不存在($false)。

    想象一下你有这样一个函数:

    function test-switch ([string]$name,[switch]$force) { ... }
    

    你这样称呼它:

    test-switch -force $false
    

    由于开关参数存在或不存在,$false 实际上会绑定到 Name 参数。那么,如何将值绑定到开关参数?用冒号:

    test-switch -force:$false
    

    现在参数绑定器知道值转到哪个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 2011-10-06
      • 2013-03-24
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多