PowerShell学习笔记(1)-基础
PowerShell學習筆記(1):基礎
??前段時間在知乎上得知Windows下的一款強大的命令行工具PowerShell(原諒我剛剛得知)。 其強大的功能,令人驚嘆,興趣盎然,這么優秀的工具值得我去學習、了解, 雖然我并不是程序猿。我的測試練習環境:win7 PowerShell v1.0
基礎內容
命令的概念與術語
??基本命令形式如下:
command -parameter1 -parameter2 arg1 arg2
- command:命令名稱
- parameter1:開關參數
- parameter2 arg1:帶參數變量的參數
- arg2:位置參數
例:Write-Output -InputObject HelloWorld
??dir -Recurse -Filter *.ps1 D:\Test,其中開關參數-Recuse指定dir命令顯示指定目錄及其子目錄下的所有文件,-Filter *.ps1過濾出后綴為ps1的文件。
命令分類
??PowerShell中的命令可以分為四類:cmdlets、functions、scripts、native Win32 executables。
cmdlet C#源碼例子:
[Cmdlet("Write", "InputObject")] public class MyWriteInputObjectCmdlet : Cmdlet {[Parameter]public string Parameter1;[Parameter(Mandatory = true, ValueFromPipeline=true)]public string InputObject;protected override void ProcessRecord(){if (Parameter1 != null)WriteObject(Parameter1 + ":" + InputObject);elseWriteObject(InputObject);} }shell函數命令源碼例子:
function Write-InputObject {param($Parameter1)process{if ($Parameter1){"$Parameter1: $_"}else{"$_"}} }shell腳本命令源碼例子:
param($Parameter1) process {if ($Parameter1){"$Parameter1:$_"}else{"$_"} }native Win32 executables也被稱作為本地命令,是能被操作系統執行的外部程序。
別名與彈性語法
??PowerShell中實現了大量的預定義別名,這些別名可以分為兩個基本的類別:transitional別名和convenience別名。使用Get-Command命令可以查看別名的具體的定義。
PowerShell語句解析
??雙引號、單引號與反引號之間的區別。
??轉義序列,如下:
`n 換行 `r 回車 `t 水平制表符`a 警鈴`b 退格`' 單引號`" 雙引號 '0 空`` 單反引號??表達式模式與命令模式。在表達式模式中,字符串必須由引號括起,數字始終解析為數字等等。在命令模式中,數字被視為數字,但是其它的參數則被視為字符串(除非參數以$,@,’,”,(開頭,當以這些特殊字符開頭時,其后的參數被解析為值表達式)。
??模式解析例子,如下:
??有兩種語句終止方式:一種是以分號”;”終止,還有一種是以換行符終止。
??管線是由管線操作符”|”分割的一系列命令,如:
dir -recurse -filter *.cpp | format-table name,length??格式化與輸出。可以通過$PSHOME查看所安裝的默認格式數據庫的所在路徑。
類型處理
基本類型與字面值
??PowerShell中的字面值:strings,numbers,array,dictionaries,hashtables。
??PowerShell中,字符串是一個16位的Unicode字符序列,其直接由.NET System.String類型直接實現。單引號、雙引號字符串,例:"Double quoted string","Single quoted string"。here-strings:以@<quote><newline>開頭,并以<quote><newline>@結尾。
??數值字面值。PowerShell支持所有基本的.NET數值類型并可在需要時完成不同類型之間的轉換。數值字面值如下:
| 1 | System.Int32 | [int] |
| 10000000 | System.Int64 | [long] |
| 1.1 | System.Double | [double] |
| 1d | System.Decimal | [decimal] |
??數值乘數后綴:
| kb/KB | 1024 | 1KB | 1024 | System.Int32 |
| kb/KB | 1024 | 2.2KB | 2252.8 | System.Double |
| mb/MB | 1024*1024 | 1MB | 1045876 | System.Int32 |
| mb/MB | 1024*1024 | 2.2MB | 2306867.2 | System.Double |
| gb/GB | 1024*1024*1024 | 1Gb | 1073741824 | System.Int32 |
| gb/GB | 1024*1024*1024 | 2.14Gb | 3371549327.36 | System.Double |
??創建Hash表,語法以@{開頭以}結尾,在分隔符內以定義鍵值對集,其中鍵值以=分割,不同的鍵值對以;分割。例:$test = @{ b1 = "prml"; b2 = "ia"},可以通過$test.b1、$test['b1']訪問值,通過$test.keys得到所有鍵。
??PowerShell中創建數組的方式以逗號分割,例$test = 1, 2, 3,對于數字數組還可以使用范圍運算符$test = 2 .. 3。PowerShell中數組默認是多態的,即可以在數組中存儲任意類型的對象。創建單元素數組$test = ,1,創建空數組$test = @()。
類型名別名:
| int[] | System.Int32 |
| [int[]] | System.Int32[] |
| [long] | System.Int64 |
| [long[] | System.Int64[] |
| [string] | System.String |
| [string[]] | System.String[] |
| [char] | System.Char |
| [char[]] | System.Char[] |
| [bool] | System.Boolean |
| [bool[]] | System.Boolean[] |
| [byte] | System.Byte |
| [byte[]] | System.Byte[] |
| [double] | System.Double |
| [double[]] | System.Double[] |
| [decimal] | System.Decimal |
| [decimal[]] | System.Decimal[] |
| [float[]] | System.Single |
| [single] | System.Single |
| [regex] | System.Text.RegularExpressions.Regex |
| [array] | System.Array |
| [xml] | System.Xml.XmlDocument |
| [sriptblock] | System.Management.Automation.ScriptBlock |
| [switch] | System.Management.Automation.SwitchParameter |
| [hashtable] | System.Collections.Hashtable |
| [psobject] | System.Management.Automation.PSObject |
| [type] | System.Type |
| [type[]] | System.Type[] |
??訪問靜態方法,[類名]::屬性名,如[math]::cos([math]::pi / 3)。
??類型轉換,例:[string] [char[]] ( [int[]] [char[]] $s | foreach {$_+1} )。
操作符與表達式
??算術運算符
| + | 兩個值(數值、字符串、數組)相加 |
| * | 兩個值(數值、字符串、數組)相乘 |
| - | 兩個值(數值)相減 |
| / | 兩個值(數值)相除 |
| % | 兩個值(數值)相模 |
??賦值運算符:=、+=、-=、*=、、=、%=。
??比較運算符
| -eq -ceq -ieq | 等于 |
| -ne -cne -ine | 不等于 |
| -gt -cgt -iget | 大于 |
| -ge -cge -ige | 大于等于 |
| -lt -clt -ilt | 小于 |
| -le -cle -ile | 小于等于 |
| -contains -ccontains -icontains | 左側的集合包含右側指定的值 |
| -notcontains -cnotcontains -inotcontains | 左側的集合不包含右側指定的值 |
注:“c“變體表示大小寫敏感,”i“變體表示大小寫不敏感.未加限定比較運算符是大小寫不敏感的。
??模式匹配操作符,有兩種匹配類型:通配符表達式(wildcard expressions)、正則表達式(regular expressions)。
??通配符模式匹配運算符
| -like -clike -ilike | 通配符模式匹配,匹配上表達式值則為True |
| -notlike -cnotlike -inotlike | 與-like相反 |
??PowerShell中的通配符模式
| * | 匹配字符串中零個或多個字符 |
| ? | 匹配任意單個字符 |
| [<char>-<char>] | 匹配字符區間中的字符 |
| [<char><char>..] | 匹配字符集中任意一個字符 |
??正則表達式匹配操作符
| -match -cmatch -imatch | 正則表達式模式匹配 |
| -notmatch -cnotmatch -inotmatch | 與-match相反 |
| -replace -creplace -ireplace | 替換字符串中正則匹配的部分 |
??邏輯與按位操作符
| -and | 邏輯與 |
| -or | 邏輯或 |
| -xor | 異或 |
| -not | 邏輯非 |
| -band | 按位與 |
| -bor | 按位或 |
| -bxor | 按位異或 |
| -bnot | 位非 |
高級操作符與變量
??以類型為參數的操作符
| -is | 操作符左側的類型與右側匹配,則表達式為True |
| -isnot | 與-is相反 |
| -as | 將操作符左側的值轉換為右側指定的類型的值 |
??一元操作符:-(將參數轉為數值,求負)、+(將參數轉換為數值,并返回數值結果)、--(將參數轉換為數值,前綴返回新值,后綴返回原值)、++(類似于--)、[<type>](類型轉換)、,(一元逗號操作符,創建一個新的單元素數組)。
??表達式與分組操作符:(...)、$(...)、@(...)(返回結果是一個數組)。
??范圍運算符..,生成連續的數值數組的快捷方式。
??方法屬性操作符:.、::(靜態方法)。
??格式化運算符:-f是一個二元運算符,運算符左側是格式化字符串,右側是需格式化的數組。例:$test = "{2} {1} {0}" -f 1, 2, 3"。
??重定向運算符
| > | dir > out.txt | 重定向輸出到文件。如果文件已存在,則清空當前的內容;如果文件不存在, 則創建該文件 |
| >> | dir >> out.txt | 重定向輸出到文件。如果文件已存在,則追加到當前的文件;如果文件不存在,則創建該文件 |
| 2> | dir nosuchfile.txt 2> err.txt | 重定向錯誤流到文件… |
| 2>> | dir nosuchfile.txt 2>> err.txt | 重定向錯誤流到文件… |
| 2>&1 | dir nosuchfile.txt 2>&1 | 將錯誤流寫到輸出管線 |
??變量:PowerShell中不需顯示的聲明變量,在第一次賦值時自動創建,變量以$為前綴。
流控制語句
??if/elseif/else語句,例:
if ($test -gt 100) {"It's greater than one hundred" } elseif ($test -gt 50) {"It's greater than 50" } else {"It's not very good" }??while循環,例:
$val = 0 while ($val -ne 3) {$val++Write-Host "The number is $val" }??do-while循環,例:
$val = 0 do {$val++Write-Host "The number is $val" } while($val -ne 3)??for循環,例:
for ($i = 0; $i -le 10; $i++) {$i; }??foreach循環,例:
foreach ($i in "hello") {$i }??label,break,continue,例:
for ($i = 0; $i -le 15; $i++) {if ($i % 2){ continue }if ($i -eq 10){ break }$i }:outer while ($true) {while ($true){ break outer } }??switch語句。switch語句是PowerShell中最強大的語句,該語句將模式匹配,分支,迭代組合在一個控制結構中。switch語句語法形式如下:
switch -options ( <pipeline> ){<pattern> { <statementList> }<pattern> { <statementList> }.....default { <statementList> }} -options:控制怎樣匹配,可以是-regex、-wildcard、-match、-case。-case:大小寫敏感。-wildcard:通配符。-regex:正則表達式。 <pipeline>:用于產生值控制switch分支。另外,也可以指定序列-file <expr>代替<pipeline>。 pattern/action語句.所有的模式匹配語句都將執行,default語句僅當其他匹配模式都沒匹配到時執行。??使用cmdlets進行流控制,例:
dir *.txt | foreach-object {$_.length}1..10 | where-object { ! ($_ -band 1) }函數與腳本
??PowerShell函數的基本形式如下:
function <name> (<parameter list>) { <statement> } function subtract ($from, $to) { &from - &to } function subtract ([int]$from, [int]$to) { $from - $to }function <name> ($p1=<expr1>, $p2=<expr2>...){<statementList>} function subtract ($from=2, $to=1) { $from - $to }??參數類型
| Switches | Switches參數,例:Get-ChildItem -Recurse |
| Options | Options參數,可帶參數值,例:Get-ChildItem -Filter *.txt |
| Arguments | 位置參數,不需要有名字關聯位置參數 |
??PowerShell變量的作用域。PowerShell支持四個作用域:全局(global)、本地(local)、私有(private)和腳本(script)。
??$global:test = 1 全局變量,在所有的作用域中有效,如果在腳本或者函數中設置了全局變量,即使腳本和函數都運行結束,這個變量也任然有效。
??$script:test = 1 腳本變量,只會在腳本內部有效,包括腳本中的函數,一旦腳本運行結束,這個變量就會被回收。
??$private:test = 1 私有變量只會在當前作用域有效,不能傳遞給其它的作用域,只能在當前作用域下讀寫。
??$local:test = 1 局部變量,可以省略修飾符,在當前作用域有效。本地變量能夠在其它作用域下讀取,但是不能通過其它作用域修改,只有本地作用域可以修改。
??return返回函數值,例:
function fact($x) {if ($x -lt 2){return 1}$x * (fact($x - 1)) }??在管線中使用函數。通過特殊變量$input可以實現在管線中使用函數,這個變量包含一個枚舉器以處理輸入集合。例:
function sum($para) {$total = 0while ($input.MoveNext()){$total += $input.Current.$p}$total }dir | sum length??過濾器執行一次,并自動實現循環管線中的每個元素。與函數通過$input來訪問當前管線對象不同,過濾器有一個特殊的變量$_表示當前的管線對象。過濾器的一般形式與示例如下:
filter <name> (<parameter list>) {<statementList>}
filter sum {if ($_ % 2 -eq 0){ $_} }??cmdlet風格的函數,完整函數語法定義如下:
function <name> (<parameter list>) {begin {<statementList> #第一個管線對象可用之前執行}process {<statementList> #逐一執行每個管線對象}end {<statementList> #所有管線對象執行完后執行} }function test ($x) {begin{ $c = 0; "In begin, C is $c, x is $x"}process{ $c++; "In process, c is $c, x is $x, `$_ is $_"}end{"In end, c is $c, x is $x"} }參考文檔
1. 《Windows PowerShell in Action》
2. 使用Windows PowerShell 編寫腳本
3. PowerShell-腳本之家
4. Cmdlet Overview
5. PowerShell中文博客
轉載于:https://www.cnblogs.com/corfox/p/5415007.html
總結
以上是生活随笔為你收集整理的PowerShell学习笔记(1)-基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用NuGet发布自己的类库包(Libr
- 下一篇: javax.mail 发送