Powershell:命令行参数中的冒号

von*_*ryz 13 powershell

Powershell命令行开关参数需要冒号的处理是什么?

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

Move-ActiveMailboxDatabase -Confirm:$false
Run Code Online (Sandbox Code Playgroud)

没有冒号,命令无法识别不确认开关,如此

Move-ActiveMailboxDatabase -Confirm $false
Run Code Online (Sandbox Code Playgroud)

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

我浏览了Powershell in Action和Powershell 2.0,但没有找到任何关于这种语法的内容.然而,范围解析和.Net对象访问使用记录在这些书籍上.

我的谷歌发现了一篇文章声称它明确转发了切换参数值,但未能解释这是什么.

man*_*lds 22

当你这样做时:

Move-ActiveMailboxDatabase -Confirm $false
Run Code Online (Sandbox Code Playgroud)

你不是说Confirm参数接受了$false.您正在说-Confirm并且还将带有值的(单独)参数传递给cmdlet $false.

既然Confirm是一个开关,只是存在-Confirm意味着它是真的.缺乏-Confirm意味着它是错误的.

我来给你一个脚本示例:

param([switch]$test)

write-host Test is $test
Run Code Online (Sandbox Code Playgroud)

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

Test is False
Run Code Online (Sandbox Code Playgroud)

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

Test is True
Run Code Online (Sandbox Code Playgroud)

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

Test is True
Run Code Online (Sandbox Code Playgroud)

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

Test is False
Run Code Online (Sandbox Code Playgroud)

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

例如,考虑脚本:

param ([boolean]$in)

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

func -test:$in
Run Code Online (Sandbox Code Playgroud)

在这里,如果你运行它.\script.ps1 -in $false,你得到

Test is false
Run Code Online (Sandbox Code Playgroud)

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

if($in){  func -test}
else { func }
Run Code Online (Sandbox Code Playgroud)


Sha*_*evy 7

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

想象一下,你有这样的功能:

function test-switch ([string]$name,[switch]$force) { ... }
Run Code Online (Sandbox Code Playgroud)

你这么称呼它:

test-switch -force $false
Run Code Online (Sandbox Code Playgroud)

由于切换参数是否存在,$ false实际上将绑定到Name参数.那么,如何将值绑定到switch参数?用冒号:

test-switch -force:$false
Run Code Online (Sandbox Code Playgroud)

现在,参数binder知道值的参数.