Powershell 中除了常見的算術運算符,賦值運算符,比較運算符,位運算符,邏輯運算符,字符串的拆分和合並運算符,轉義字符,還有一些特殊的運算符,這些特殊的運算符往往可以解決一些特殊的問題,比如執行運行命令,更改值的數據類型等。
& (調用運算符)
使用 & (調用運算符)可以運行命令、腳本或腳本塊。因爲調用運算符不進行分析,所以它不能解釋命令參數。此調用運算符用於指示它後面的值爲命令(而不是字符串)。使用此運算符可以運行存儲在變量中並由字符串表示的命令。例如:
PS C:\> $command = "Get-Service" PS C:\> $command Get-Service PS C:\> & $command Status Name DisplayName ------ ---- ----------- Stopped AdobeFlashPlaye... Adobe Flash Player Update Service Stopped Alerter Alerter Stopped ALG Application Layer Gateway Service Stopped AppMgmt Application Management Stopped aspnet_state ASP.NET 狀態服務 Running Ati HotKey Poller Ati HotKey Poller Running AudioSrv Windows Audio ...
從上面的例子中可以看出,將 Get-Service 命令賦值給變量 $command , 所以當輸入 $command 輸出的是字符串值 "Get-Service",如果要執行該命令,則需要在變量前添加調用運算符。
這個命令在實際的應用中非常有用,比如可以將cmd 命令賦值給變量,然後利用調用運算符就可以執行 cmd 命令。
2. . (屬性引用運算符,或稱爲點運算符)
利用屬性運算符就可以像高級語言語言一樣,通過點運算符訪問對象的屬性和方法。例如:
PS C:\> $myStr = "This is my string" PS C:\> $myStr.Length 17 PS C:\> $myStr.Substring(1,4) his
點運算符,再加上 Powershell 的自動補全功能,可以極大地提高輸入命令的準確度,例如你可以輸出 $myStr.Len<Tab鍵> , 命令就會自動補全。 前面我們介紹了字符串的拆分和合並運算符,其實有很大一部分操作,可以通過字符串的方法來實現,比如字符串的SubString()可以截取指定的子字符串。
除了引用屬性,點運算符還有一種更重要的應用。
使用點"." 獲得來源運算符
意思是通過運行腳本,使腳本中的項目成爲調用作用域的組成部分,通俗點將就是,可以在當前腳本中調用其他的腳本,則其他腳本中的方法及變量在當前作用域都有效。這在腳本的模塊化的使用中非常有用,即可以將經常使用的方法放在一個腳本中,每次使用時加載這個腳本,就可以使用該腳本中的方法。例如:
. c:\.sample.ps1
如果在腳本中加入該語句,則可以在當前作用域使用sample.ps1 中的所有方法及變量。
除此之外,點運算符還有最常見的使用。
點 (.) 還用作父目錄符號
這一點應該是大家都屬性的。在 Powershell 中,雙擊腳本,默認是不會執行的(不像bat等腳本,雙擊直接運行),這主要是出於對安全的考慮。在 Powershell 執行腳本的格式如下:
PS C:\> .\sample.ps1
3. :: (靜態成員運算符)
靜態成員運算符經常用來調用 .NET Framework 類的靜態屬性運算符和方法。要查找對象的靜態屬性和方法,可以把命令的輸出通過管道(|)輸入給 Get-Member cmdlet 命令。例如:
PS C:\> [datetime]::now 2017年1月15日星期日 19:11:40 PS C:\> [datetime]::now | Get-Member TypeName: System.DateTime Name MemberType Definition ---- ---------- ---------- Add Method System.DateTime Add(System.TimeSpan value) AddDays Method System.DateTime AddDays(double value) AddHours Method System.DateTime AddHours(double value) AddMilliseconds Method System.DateTime AddMilliseconds(double value) AddMinutes Method System.DateTime AddMinutes(double value)
4. ..(範圍運算符)
範圍運算符表示給定上下限的整數數組中的序列整數,注意該運算符只針對整數有效。利用該運算可以快速創建指定範圍的整數數組。例如:
PS C:\> 1..4 1 2 3 4 PS C:\> 4..1 4 3 2 1 PS C:\> $max = 5 PS C:\> foreach ( $a in 1..$max )` >> { >> Write-Host $a >> } >> 1 2 3 4 5
從上面的例子中可以看出,使用範圍運算符可以使語法更簡潔和直觀。
5. -f (格式運算符)
使用字符串對象的格式化方法對字符串進行格式化。在運算符左側輸入格式字符串,在運算符右側輸入要格式化的對象。例如:
PS D:\> "{0} {1} {2:N}" -f 1,"Hello",[math]::pi 1 Hello 3.14
以上語句中-f 之前的{0} {1} {2} 都是佔位符,-f 之後是要替換佔位的值,對於第三個值,格式化使其只輸出兩位小數。
格式運算符常用在對時間,日期,以及對輸出結果(保留幾位小數等)的格式化。
6. $( ) 子表達式運算符
返回一條或多條語句的結果。對於單個結果將返回標量。對於多個結果將返回數組。例如:
PS C:\> $x = 2 PS C:\> $( $x * 5) 10 PS C:\> $( Get-Process powershell) Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 432 6 29248 20352 139 3.27 3320 powershell
7. @( ) 數組子表達式運算符
通過數組返回一條或多條語句的結果。如果只有一項,則數組只有一個成員。例如:
PS C:\> @( Get-WmiObject win32_logicalDisk) DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 27906625536 Size : 44811317248 VolumeName : DeviceID : D: DriveType : 3 ProviderName : FreeSpace : 7755649024 Size : 42950717440 VolumeName : 軟件
8. ,(逗號運算符)
用作二元運算符時,逗號用於創建數組。用作一元運算符時,逗號用於創建只含一個成員的數組。逗號放在成員之前。例如對比一下命令的執行結果:
PS C:\> $myArray = 1,2,3 PS C:\> $singleArray = ,1 PS C:\> $singleInt = 1
第一條命令和第二條命令創建都是整數數組,第二條命令創建的數組只有一個元素。第三條命令創建的是一個數型變量。
總結
Powershell 中的特殊運算符可以實現一些其他運算無法實現的一些功能。尤其是調用運算符和點運算,以及靜態成員運算符,可以實現其他運算望塵莫及的功能,掌握好這些特殊運算符,可以實現 Powershell 中許多奇技淫巧。