2011-12-15 24 views
9

Thỏa thuận với các tham số chuyển đổi lệnh Powershell yêu cầu dấu hai chấm là gì?Powershell: Colon trong tham số commandlet

Xem xét lệnh ghép ngắn quản lý Exchange 2010 Move-ActiveMailboxDatabase. Việc chuyển đổi Confirm là một System.Management.Automation.SwitchParameter và phải được sử dụng như vậy,

Move-ActiveMailboxDatabase -Confirm:$false 

Nếu không có đại tràng lệnh thất bại trong việc nhận ra không xác nhận chuyển đổi như vậy,

Move-ActiveMailboxDatabase -Confirm $false 

Tại sao vậy? Sự khác biệt của ruột kết là gì? Tại sao Exchange2010 có vẻ là điều duy nhất tôi nhận thấy hành vi này?

Tôi đã duyệt qua Powershell trong Action và Powershell 2.0, nhưng không tìm thấy bất kỳ điều gì về cú pháp này. Phạm vi độ phân giải và sử dụng truy cập đối tượng .Net được ghi lại trên những cuốn sách mặc dù.

Google-fu của tôi tìm thấy một số article tuyên bố rằng nó chuyển tiếp rõ ràng giá trị thông số chuyển đổi, nhưng không giải thích được ý nghĩa của nó.

Trả lời

19

Khi bạn làm:

Move-ActiveMailboxDatabase -Confirm $false 

bạn không nói Confirm tham số chấp nhận $false. Bạn đang nói -Confirm và cũng chuyển một đối số (riêng biệt) cho lệnh ghép ngắn với giá trị $false.

Confirm là công tắc, chỉ sự hiện diện của -Confirm có nghĩa là nó là đúng. Sự vắng mặt của -Confirm có nghĩa là nó là sai.

Để tôi cho bạn một ví dụ kịch bản:

param([switch]$test) 

write-host Test is $test 

Nếu bạn chỉ chạy các kịch bản mà không cần bất kỳ đối số/paramters tức .\script.ps1 bạn nhận ra:

Test is False 

Nếu bạn chạy nó như .\script.ps1 -test, đầu ra là

Test is True 

Nếu bạn chạy nó như .\script.ps1 -test $false, đầu ra là

Test is True 

Nếu bạn chạy nó như .\script.ps1 -test:$false đầu ra là

Test is False 

Đó là trong các tình huống trong đó giá trị cho một biến chuyển chính nó có để được xác định từ một biến khác rằng : Được sử dụng.

Ví dụ, hãy xem xét các kịch bản:

param ([boolean]$in) 

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

func -test:$in 

đây nếu bạn chạy nó như .\script.ps1 -in $false, bạn sẽ có được

Test is false 

Nếu bạn không thể sử dụng :, bạn sẽ có để viết như sau:

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

Không phải câu trả lời đầy đủ - Tôi không biết về ví dụ Hộp thư, nhưng trong nhiều trường hợp khác (ví dụ: 'Set-SMBServerConfiguration'), hiệu ứng' -Xác nhận: $ false' khác với sự vắng mặt của nó. Tôi có thể sử dụng '-Xác nhận: $ false' hoặc' -Force', nếu không tôi cần phải xác nhận. – Lamarth

4

Dấu hai chấm có thể được sử dụng với mọi mệnh danh giá trị ter nhưng đặc biệt hơn trong trường hợp thông số chuyển đổi. Các tham số chuyển đổi không có giá trị, chúng là hiện tại ($ true) hoặc vắng mặt ($ false).

Hãy tưởng tượng bạn có một chức năng như thế này:

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

Và bạn gọi nó như vậy:

test-switch -force $false 

Kể từ khi thông số chuyển đổi là một trong hai mặt hay không, $ false thực sự sẽ liên kết với Tên tham số. Vì vậy, làm thế nào để bạn ràng buộc một giá trị cho một tham số chuyển đổi? Với đại tràng:

test-switch -force:$false 

Bây giờ các tham số chất kết dính biết mà thông số giá trị đi vào.

Các vấn đề liên quan