這一部分着重於介紹Powershell的程序知識,讓咱們可以編寫功能強大的Powershell腳本,執行比較複雜的任務。正則表達式
變量使用$變量名
建立和引用。舉個例子,Get-Location
命令用於獲取當前工做目錄位置,它的別名是pwd
。那麼咱們可使用下面的命令來建立一個變量,存儲當前目錄位置。shell
C:\Users\asddf> $current=pwd
而後咱們訪問$current
,就能夠獲取實際值了。編程
C:\Users\asddf> $current Path ---- C:\Users\asddf
若是知道這個命令返回的實際是.NET對象的話,咱們還能夠更進一步,比方說直接訪問這個對象的Path
屬性,獲取值。windows
C:\Users\asddf> $current.Path C:\Users\asddf
還有一個命令Get-Member
,別名是gm
,用於獲取對象的屬性。比方說,咱們將Get-Location
命令的結果經過管道傳遞給Get-Member
命令,就會顯示下面的輸出。若是不瞭解.NET的話,可能感受比較陌生。可是若是你懂得.NET和C#的話,就會像我同樣大喊一聲:「臥槽,還能這樣玩?!」數組
C:\Users\asddf> Get-Location|Get-Member TypeName:System.Management.Automation.PathInfo Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() Drive Property System.Management.Automation.PSDriveInfo Drive {get;} Path Property string Path {get;} Provider Property System.Management.Automation.ProviderInfo Provider {get;} ProviderPath Property string ProviderPath {get;}
若是咱們要獲取對象的全部屬性,使用MemberType
參數。瀏覽器
C:\Users\asddf> pwd|gm -MemberType Property
咱們還能夠在變量上調用方法, 好比說將路徑轉換爲全小寫。框架
C:\Users\asddf> $current.Path.ToLower() c:\users\asddf
最後,若是再也不須要一個變量,可使用Remove-Variable
刪除變量,它的別名是rv
。編程語言
C:\Users\asddf> Remove-Variable current
來看看Powershell中支持的操做符。ide
首先,基本的數學運算符都是支持的。函數
PS D:\Desktop> $i=5 PS D:\Desktop> $sum=3+4*($i-3)/2 PS D:\Desktop> $sum 7
前置後置自增自減運算符也是支持的。
PS D:\Desktop> $i=0 PS D:\Desktop> $i-- PS D:\Desktop> $i++ PS D:\Desktop> ++$i PS D:\Desktop> --$i
而後是比較運算符,這些和Linux Shell中很類似,有大於(-gt
),大於等於(-ge
),小於(-lt
),小於等於(-le
),等於(-eq
),不等於(-ne
)幾個。
-like
和-notlike
用於?*
這樣的通配符。
PS D:\Desktop> 'hello' -like '?ello' True PS D:\Desktop> 'hello' -notlike '?ello' False PS D:\Desktop> 'hello' -like '*o' True
-match
和-notmatch
用於正則表達式。
PS D:\Desktop> 'aabcc' -match 'a*b?c+' True PS D:\Desktop> 'aab' -match 'a*b?c+' False
-contains
查找序列中是否包含某個元素。
PS D:\Desktop> 'hello','zhang3' -contains 'zhang3' True
-replace
用於替換字符串中某個部分,固然正則表達式也是支持的。
PS D:\Desktop> 'hello zhang3' -replace 'zhang3','yitian' hello yitian
-split
和-join
用於將一個字符串分爲幾個子部分,或者將幾個子部分組合爲一個字符串。
PS D:\Desktop> 'A B C DE' -split ' ' A B C DE PS D:\Desktop> 'A','B','C' -join ',' A,B,C
上面這些運算符都是大小寫不敏感的,若是須要大小寫敏感的功能,能夠在運算符前面添加c
前綴。
PS D:\Desktop> 'yitian' -match 'Yitian' True PS D:\Desktop> 'yitian' -cmatch 'Yitian' False
邏輯運算符有與(-and
)、或(-or
)、非(-not
或!
)以及異或(xor
)幾個,而且支持短路計算。
若是須要使用真值和假值字面量,可使用$true
和$false
。
Powershell 和.NET平臺綁定,因此它是一門強類型的腳本。所以咱們能夠在腳本中判斷數據的類型,只要使用-is
或-isnot
運算符便可,類型須要寫到方括號中。這裏的類型能夠是全部合適的.NET類型。
PS D:\Desktop> 3.14 -is [Double] True PS D:\Desktop> 3.14 -isnot [Float] True
這個稍微比較麻煩一點。
首先是>
和>>
運算符,用於將標準輸出流重定向到文件,前者會覆蓋已有文件,後者則是追加到已有文件末尾。
而後咱們來講說日誌級別,若是有使用過某些語言的日誌框架的話,就很好理解了。在這裏,2表明錯誤、3表明警告、4表明信息、5表明調試信息。n>
和n>>
運算符就是用於將對應級別的輸出重定向到文件的,這二者的區別和前面相同。n>&1
將對應級別的輸出和標準輸出一塊兒重定向到文件。
最後就是*>
和*>>
了,這二者將全部輸出信息重定向到文件。
須要注意,Powershell使用Unicode編碼來輸出信息。若是你須要使用其餘類型的編碼,就不能使用重定向運算符了,而應該使用Out-File
命令。
&
運算符將它後面的命令設置爲後臺運行,當運行的命令須要阻塞當前終端的時候頗有用。
.\\
運算符用於執行一個腳本或命令。若是執行的是Powershell腳本,那麼腳本會在本身的做用域中執行,也就是說在當前環境下沒法訪問被執行的腳本中的變量。
[]
運算符用於轉換變量的類型,好比說下面的代碼,就將pi
變量轉換爲了Float
類型。
[Float]$pi = 3.14 $pi -is [Float]
.
運算符用於調用.NET對象的成員,它也能夠用於執行腳本。當它用於執行腳本的時候,腳本會在當前做用域中執行。因此腳本結束以後,咱們能夠訪問腳本中的元素。
::
運算符用於調用類中的靜態成員,例以下面就會調用.NET平臺中DateTime
類的Now
屬性。
PS D:\Desktop> [DateTime]::Now 2017年5月18日 22:45:42
..
運算符用於建立一個範圍閉區間,例以下面這樣。
PS D:\Desktop> 1..3 1 2 3 PS D:\Desktop> 3..1 3 2 1
-f
運算符用於格式化數據,例以下面這樣。格式化方法和C#中的徹底相同,因此若是不熟悉的話直接看在C#中如何格式化數據就好了。
PS D:\Desktop> 'My name is {0}, I am {1} years old' -f 'yitian',24 My name is yitian, I am 24 years old
$
運算符能夠將字符串內部的變量轉換爲實際的值,例以下面這樣。須要注意使用內插操做符的時候,外部字符串須要使用雙引號,不然Powershell會直接輸出字符串內容。
PS D:\Desktop> $name='yitian' PS D:\Desktop> $age=24 PS D:\Desktop> "My name is $name, I am $age years old." My name is yitian, I am 24 years old.
@()
運算符用於將一系列值轉換爲一個數組。假如在腳本中有一個函數可能返回0、1或多個值,就可使用這個操做符,將一系列值合併爲一個數組,方便後續處理。
,
逗號運算符若是放置在單個值前面,就會建立一個包含這個值的單元素數組。
Powershell中的條件判斷和通常的編程語言以及Shell編程都很相似,直接看代碼就能理解。
$condition = $true if ($condition -eq $true) { Write-Output "condition is $true" } elseif ($condition -ne $true ) { Write-Output "condition is $false" } else { Write-Output "other ocndition" }
若是須要多重判斷,能夠考慮使用switch語句。一個典型的switch以下所示。
$n = 4 switch ($n) { 1 {"n is 1"} 2 {"n is 2"} 3 {"n is 3"} default {"n is others"} }
其實細提及來,這個switch的坑仍是很多的。例如,switch語句能夠接受多個值來測試,在switch語句中還能夠編寫多個case相同的語句。這裏我就不細說了,想具體瞭解的話直接看官方文檔 about_Switch吧。
提醒一下,不論是哪一種循環語句,在循環體內均可以使用break
或continue
中斷/繼續循環。
首先來看看do-while循環,先執行循環體,而後判斷是否知足條件,若是知足條件則繼續執行。
$i = 0 do { $i++ Write-Output $i }while ($i -ne 3)
而後是do-until循環,和do-while相似,不過當條件不知足的時候纔會繼續循環,若是知足條件則退出循環。
$i = 0 do { $i++ Write-Output $i }until ($i -eq 3)
while循環是先判斷循環條件,知足條件時執行循環。
$i = 0 while ($i -lt 3) { Write-Output $i $i++ }
for循環能夠看作是while循環的另外一種形式,經常使用於固定次數的循環。
for ($i = 0; $i -ne 3; $i++) { Write-Output $i }
for-each循環用於遍歷一個集合中的全部元素。
$array = @(1, 2, 3, 4) foreach ($i in $array) { Write-Output $i }
值得一提的是,for-each語句用在管道上時,還有如下一種用法。
<command> | foreach {<beginning command_block>}{<middle command_block>}{<ending command_block>}
使用這種方法時,for-each後面能夠跟三個語句塊,第一個語句塊是開始語句塊,在循環前執行一次,經常使用來初始化一些數據;第三個是結束語句塊,在循環結束以後執行一次,經常使用於統計一些循環數據;第二個就是正常的循環語句塊,會循環屢次。
定義函數使用function
關鍵字。
function hello { Write-Output 'Hello Powershell' }
定義好函數以後,就可使用函數名來調用函數了。
hello
函數固然也能夠帶參數了,參數列表有兩種寫法:第一種是C風格的,參數列表寫在函數名後面,使用小括號分隔開;第二種方式是在方法體中,使用param
關鍵字聲明參數。這兩種方法是徹底等價的,固然我習慣上仍是喜歡使用第一種方式。
Powershell是一種強類型的腳本語言,因此能夠在參數列表上添加參數類型,參數類型是可選的,不過我仍是推薦寫的時候帶上類型,方便閱讀和類型檢查。
function Say-Hello ([string] $name) { Write-Output "Hello, $name" } function Say-Hello2 { param([string] $name) Write-Output "Hello, $name" }
調用帶參數的函數時,須要向調用命令那樣,使用-參數名
來傳遞參數,例以下面這樣。
Say-Hello -name 'yitian'
Powershell支持默認參數,直接用賦值號=
在參數列表上指定參數默認值便可。
function Say-Hello3 { param([string] $name = 'zhang3') Write-Output "Hello, $name" }
Powershell也支持位置參數,它會把全部參數包裝到$args
數組中,因此咱們能夠經過這個變量訪問全部位置的參數。例以下面,將全部參數合併一個字符串,而後打印出來。
function Say-Hellos { $names = $args -join ',' Write-Output "Hello, $names" }
這個函數調用時候須要指定多個參數,注意不要在多個參數之間添加括號,不然會變成一個數組參數,而不是多個參數。
Say-Hellos 'yitian' 'zhang3' 'li4'
開關參數沒有類型,做用僅僅是標誌是或者否。若是在使用函數的時候帶上開關參數,那麼它就是開的狀態,不然就是關的狀態。開關參數須要指定參數類型爲switch
。
function Answer-Hello ([switch] $yes) { if ($yes) { Write-Output "Hi" } }
而後在調用時就能夠看出區別了。
Answer-Hello -yes Answer-Hello
最後來講說函數返回值。這個其實也很簡單,只要使用return
語句就能夠了。
function Add ([double]$a, [double]$b) { $c = $a + $b return $c }
而後咱們調用函數,就能夠看到結果了。
Add -a 3 -b 5
關於Powershell編程的知識就介紹到這裏,其實若是看看官方文檔的話,就知道這裏介紹的也僅僅是一部分而已。不過這一部分對於咱們平常使用和學習基本上也夠用了。
若是要查看詳細幫助的話,能夠運行一下下面的命令,這樣會顯示全部和Powershell相關的幫助文檔。
Get-Help about*
而後,就能夠閱讀本身感興趣的部分了。比方說,若是咱們想了解用Powershell編寫類,就可使用下面的命令。若是想在瀏覽器中瀏覽器在線版本,加上-online
參數便可。
Get-Help about_Classes