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