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)
冒号可以与每个参数值一起使用,但在开关参数的情况下更加特殊.切换参数不带值,它们存在($ 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知道值的参数.
| 归档时间: |
|
| 查看次数: |
6368 次 |
| 最近记录: |