這一篇我們來講一下參數的互斥,何謂參數互斥呢.用九胖風格的話說就是互懟,有我沒你,有你沒我.
例如我們爲一個Ping功能Function設定了兩個參數,一個叫ComputerName,一個叫IPAddress.如果你不使用參數互斥,那麼使用的時候有可能會出現又指定ComputerName又指定IPAddress的情況.那到底是Ping計算機名還是IP地址呢?正確使用了參數互斥:ParameterSetName就可以很好的解決問題.
目標
輸入姓名和年齡後,直接在顯示 某某 今年 多少 歲 .
強制要求輸入ChineseName或EnglishName.
ChineseName或EnglishName互斥.二者只能選其一.
示例:
Function Test-Function {Param ( [parameter( Mandatory = $true, ParameterSetName = "ChineseName")]$ChineseName, [parameter( Mandatory = $true, ParameterSetName = "EnglishName")]$EnglishName, [parameter( Position = 0 )]$Age = "18") Write-Host "$ChineseName$EnglishName 今年 $Age 歲." }
說明:
與上篇文章中相比,把單一的Name參數修改成了ChineseName與EnglishName,並且分別設置了ParameterSetName.
因爲此例中位置參數Position = 0不能同時給兩個參數,所以暫時去掉.將第1個位置給了Age,這樣我們在輸入名字以後還是可以省掉輸入"-Age".
最後在Write-Host的位置,我將$ChineseName$EnglishName寫在了一起,因爲他們之間互斥,肯定會有一個爲空,那麼實際顯示的時候就只會顯示其中一個參數的值.所以不必糾結這樣的寫法.
注意:
1.ParameterSetName可以設置成任何字符,但當你使用了其中某一個ParameterSetName的參數時,只有相同的ParameterSetName的參數或是沒有設置ParameterSetName的參數(相當於是共用的參數)可以使用,其他的ParameterSetName的參數就會被互斥給排除掉.
2.當兩個ParameterSetName的參數都被設定爲強制(Mandatory)時,不會因爲互斥而報錯.
運行結果:
上圖我們也可以看到互斥以後的效果.我們在使用了-EnglishName之後-ChineseName的參數就不會在自動提示中顯示了,那也就是代表說ChineseName參數被互斥以後不再適用於當前這條命令了.
接下來我們再運行一下代碼.我使用ChineseName和EnglishName都能夠正確的顯示.
看過了這個例子之後可以瞭解到,參數互斥:ParameterSetName在實際情況下可以避免我們在不小心或不知道的情況下同時輸入了兩個本不應該同時出現的參數值,大大的減少輸入的錯誤.
擴展一下,ParameterSetName允許多個參數使用同一個值例如"A",這時所有ParameterSetName爲"A"的是一組參數,當使用了"A"裏的一個參數時,所有同爲"A"的參數仍然被保留下來可以使用.但如果另外使用了一個"B"的參數時,那麼"A"這一組的參數會被全部排除變成不可使用的參數了.
從下篇開始,我們將繼續爲Function增加接受從管道"|"傳值的功能.因爲這個功能比較重要,內容會稍多一些,大概會有3個小節.