在Windows PowerShell腳本語言中有一些變量名稱是有限制的,使用它們可能會產(chǎn)生一些超出預(yù)期和意想不到的結(jié)果。每一個腳本新手遇到這類問題的時候,都會很苦惱,想知道這個腳本哪里出問題了。而罪魁禍?zhǔn)谆旧贤褪荘owerShell的自動變量。
PowerShell語言本身需要一些變量的支持才能正確運行。PowerShell使用這些變量來存儲各類信息單位,并且允許用戶讀取這些變量,而不能對它們進(jìn)行寫入操作。PowerShell在這些變量里面存儲著不同類型的信息。
最通用的一個自動變量就是管道變量$_,它也被叫做$PSItem。這個變量被用于展示對象在PowerShell管道里的流向。
如果你想要使用PowerShell讀取一個CSV文件或者使用Get-AdUser命令來查找Active Directory用戶,但是你并不想檢索CSV或者整個Active Directory用戶的所有項,這時候你就可以使用另外一個通用的自動變量:where alias(也可以叫做 Where-Object)。例如,如果你要查詢一個以FirstName和LastName為文件頭的CSV文件,那會包含上百個名稱;有一個可以只獲取到last name為Jones的命令就是Where-Object(如下圖)。
在這個實例里,我使用了管道變量來展示從Import-Csv命令獲取到每一個名字。我引用LastName屬性作為管道變量,并且告知Where-Object命令只顯示最后名稱為Jones的名字。我不能使用$_變量給自身分配一個值,因為PowerShell已經(jīng)在使用它了。
如下圖的PowerShell腳本,你想要使用$_來匹配somethingelse,但是沒用,因為PowerShell允許管理員編寫任何自動變量;你會注意到并沒有錯誤發(fā)生,這個問題經(jīng)常會絆倒一些新的PowerShell用戶。
最后,另外兩個自動變量是$true和$false。PowerShell保留這些變量是為了標(biāo)識Boolean True和Boolean Falsevalue。這些值一直都穿插用于所有的PowerShell腳本,來檢查各類條件。例如,你可以使用$false變量來檢查是否某些值是否相等,如下圖所示,我用它來檢查整數(shù)1是否等于整數(shù)2。
在這個案例中,1不等于2,我使用“1 -eq 2”的比較結(jié)果與自動變量$false進(jìn)行比對來確認(rèn)。如期望的,另外一個自動變量$true也得到相同的結(jié)論。
當(dāng)你試圖分配一個變量給$false(如下圖所示),你會得到這個變量是只讀或者是常量的報錯信息。在這兩種情況下,意味著這個變量是不允許在其他地方被定義或者被更改值的。
這些例子都很相似,所以很難出錯。無論如何,在你著手創(chuàng)建一個大型腳本時候,使用自動變量的問題會變得很難被追蹤。記?。耗悴恍枰獙σ粋€問題獲取實際的錯誤。下一次你遇到腳本問題時,即使所有似乎看起來都很正常,但是檢查自動變量可以確保你使用的不是某種沖突PowerShell的變量?! ?