從歷史上看,Unix 系統上的命令行實用程序比 Windows 上的開發得更好,但隨著新解決方案的出現,情況發生了變化。
PowerShell 可以用解釋型多範式語言編寫腳本,該語言具有經典過程、面向對象甚至函數式編程的元素:條件分支、循環、變量、數組、哈希表、類、錯誤處理以及函數, cmdlet 和管道。
目錄:
您可以在任何文本編輯器中或使用集成開發環境編寫代碼 - 最簡單的方法是使用 Microsoft 服務器操作系統附帶的 Windows PowerShell ISE。 這僅對於相當複雜的腳本是必要的:簡短的命令集更容易交互執行。
評論
使用註釋以及適當的縮進和空格被認為是良好編程風格的一部分:
# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.
<#
Так обозначаются начало и конец блочного комментария.
Заключенный между ними текст интерпретатор игнорирует.
#>
變量及其類型
PowerShell 中的變量是命名對象。 它們的名稱可以包含下劃線字符以及字母和數字。 $ 符號總是在名稱之前使用,並且要聲明一個變量,給解釋器一個有效的名稱就足夠了:
要初始化變量(為其賦值),請使用賦值運算符(符號 =):
$test = 100
您可以通過在名稱或值之前的方括號(類型轉換運算符)中指定變量的類型來聲明變量:
[int]$test = 100
$test = [int]100
重要的是要了解 PowerShell 中的變量是成熟的對象(類),其屬性和方法的類型基於 .NET Core 中的類型。 我們列出主要的:
類型(.NET 類)
描述
示例代碼
[字符串] 系統.字符串統一碼字符串
$測試=“測試”
$測試 = '測試'
Unicode 字符(16 位)
[字符]$測試 = 'c' [布爾] 系統布爾值布爾類型(布爾 True 或 False)
[布爾]$測試=$真 [int] 系統.Int32三十二位整數(32 位)
[int]$測試 = 123456789 [長] System.Int64六十四位整數(64 位)
[長]$測試 = 12345678910 [單一] 系統.單一浮點數 32 位長
[單個]$測試 = 12345.6789 [雙]系統.雙長度為 64 位(8 字節)的浮點數
[雙]$測試= 123456789.101112 [十進制]System.Decimal128位浮點數(要求以d結尾)
[十進制]$test = 12345.6789d [日期時間]系統.日期時間日期和時間
$測試=獲取日期
[數組] 系統對象[]元素索引從 0 開始的數組
$test_array = 1, 2, "測試", 3, 4
[哈希表] System.Collections.Hashtable哈希表是具有命名鍵的關聯數組,根據以下原則構建:@{key = "value"}
$test_hashtable = @{one="one"; 兩個=“二”; 三=“三”}
PowerShell 支持隱式類型轉換,此外,可以動態更改變量的類型(例如,使用賦值運算符),如果不強制指定 - 在這種情況下,解釋器將給出錯誤。 您可以通過調用 GetType() 方法來確定上一個示例中變量的類型:
$test.GetType().FullName
有許多用於操作變量的 cmdlet。 使用以下命令以方便的形式顯示它們的列表:
Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap
要查看聲明的變量及其值,您可以使用特殊的 cmdlet:
Get-Variable | more
這種方法看起來過於麻煩,通過運算符或直接訪問變量的屬性和方法來處理變量要方便得多。 但是,cmdlet 有存在的權利,因為它們允許您設置一些附加參數。 重要的是要了解用戶變量僅在當前會話中定義。 當控制台關閉或腳本結束時,它們將被刪除。
系統變量
除了用戶聲明的變量之外,還有一些內置(系統)變量在當前會話結束後不會被刪除。 它們分為兩種類型,而PowerShell狀態數據存儲在自動變量中,不能自行為其分配任意值。 例如,這些包括 $PWD:
$PWD.Path
需要偏好變量來存儲用戶偏好,其值是可以改變的。 例如,$ErrorActionPreference 指定命令解釋器應如何響應非致命錯誤。
除了用於訪問聲明的變量的運算符和 cmdlet 之外,還有一個變量:偽累加器。 您可以通過與其他驅動器類比來使用它,這種情況下的變量類似於文件系統對象:
Get-ChildItem Variable: | more
或
ls Variable: | more
範圍
對於PowerShell中的變量,有作用域(Scope)的概念。 全局作用域(Global)的操作適用於整個當前會話——它包括例如係統變量。 局部(Local)變量僅在定義它們的範圍內可用:比如在函數內部。 還有腳本(Script)作用域的概念,但對於腳本命令來說,本質上是本地的。 默認情況下,在聲明變量時,它們被賦予局部作用域,要更改它,您需要一個特殊的構造,例如:$Global:variable=value。
例如,像這樣:
$Global:test = 100
環境變量(環境)
另一個偽驅動器 Env: 可從 PowerShell 獲得,可用於訪問環境變量。 當 shell 啟動時,它們是從父進程(即啟動當前會話的程序)複製的,通常它們的初始值與控制面板中的值相同。 要查看環境變量,請使用 Get-ChildItem cmdlet 或其別名(aliases):ls 和 dir。
dir Env:
這些變量是字節序列(或字符序列,如果您願意的話),其解釋僅取決於使用它們的程序。 *-Variable cmdlet 不適用於環境變量。 要訪問它們,您必須使用驅動器前綴:
$env:TEST = "Hello, World!"
算術和比較運算符
PowerShell 提供以下算術運算符:+(加法)、-(減法)、*(乘法)、/(除法)和 %(模或模)。 算術表達式的結果按照普遍接受的運算順序從左到右計算,括號用於對錶達式的各個部分進行分組。 運算符之間的空格將被忽略,它們僅用於便於理解。 + 運算符也可以連接,* 運算符可以重複字符串。 如果您嘗試將數字添加到字符串中,它將被轉換為字符串。 此外,PowerShell 中有許多比較運算符可以測試兩個值之間的匹配並返回布爾值 True 或 False:
操作者
描述
示例代碼
-eq
等於/等於(類似於其他語言中的 = 或 ==)
測試美元 = 100
$測試-eq 123
-出生
不等於/不等於(類似於<>或!=)
測試美元 = 100
$測試-ne 123
-gt
大於/更多(模擬 >)
測試美元 = 100
$測試-gt 123
-給
大於或等於/大於或等於(類似於>=)
測試美元 = 100
$測試-ge 123
-lt
小於/小於(類似於<)
測試美元 = 100
$測試-lt 123
他們
小於或等於/小於或等於(類似於<=)
測試美元 = 100
$測試-le 123
還有其他類似的運算符,例如,允許您基於通配符比較字符串或使用正則表達式來匹配模式。 我們將在以後的文章中詳細介紹它們。 符號 <、> 和 = 不用於比較,因為它們用於其他目的。
賦值運算符
除了最常見的 = 運算符之外,還有其他賦值運算符:+=、-=、*=、/= 和 %=。 他們在賦值之前更改值。 一元運算符 ++ 和 - 增加或減少變量的值,其行為類似 - 它們也適用於賦值運算符。
邏輯運算符
僅比較不足以描述複雜的條件。 您可以使用運算符編寫任何邏輯表達式:-and、-or、-xor、-not 和!..它們的工作方式與其他編程語言類似,同時您可以使用括號來指定計算順序:
("Тест" -eq "Тест") -and (100 -eq 100)
-not (123 -gt 321)
!(123 -gt 321)
條件跳轉
PowerShell 中的分支運算符是標準的:IF(IF…ELSE, IF…ELSEIF…ELSE) 和 SWITCH。 讓我們通過示例來看看它們的用法:
[int]$test = 100
if ($test -eq 100) {
Write-Host "test = 100"
}
[int]$test = 50
if ($test -eq 100) {
Write-Host "test = 100"
}
else {
Write-Host "test <> 100"
}
[int]$test = 10
if ($test -eq 100) {
Write-Host "test = 100"
}
elseif ($test -gt 100) {
Write-Host "test > 100"
}
else {
Write-Host "test < 100"
}
[int]$test = 5
switch ($test) {
0 {Write-Host "test = 0"}
1 {Write-Host "test = 1"}
2 {Write-Host "test = 2"}
3 {Write-Host "test = 3"}
4 {Write-Host "test = 4"}
5 {Write-Host "test = 5"}
default {Write-Host "test > 5 или значение не определено"}
}
週期
PowerShell 有多種循環:WHILE、DO WHILE、DO UNTIL、FOR 和 FOREACH。
如果/只要前提條件為真,則帶有前提條件的循環就有效:
[int]$test = 0
while ($test -lt 10) {
Write-Host $test
$test = $test + 1
}
帶有後置條件的循環將至少運行一次,因為在迭代後會檢查條件。 同時,當條件為 true 時,DO WHILE 起作用,而當條件為 false 時,DO UNTIL 起作用:
[int]$test = 0
do {
Write-Host $test
$test = $test + 1
}
while ($test -lt 10)
[int]$test = 0
do {
Write-Host $test
$test = $test + 1
}
until ($test -gt 9)
FOR 循環的迭代次數是預先已知的:
for ([int]$test = 0; $test -lt 10; $test++) {
Write-Host $test
}
在 FOREACH 循環中,迭代數組或集合(哈希表)的元素:
$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
Write-Host $item
}
數組
PowerShell 變量不僅存儲單個對象(數字、字符串等),還存儲多個對象。 最簡單的此類變量是數組。 一個數組可以由多個元素組成,也可以由一個元素組成,也可以為空,即不包含任何元素。 它是使用 @() 運算符聲明的,我們將在下一篇文章中用到它 - 這對於將其他數組添加到數組(創建多維數組)、將數組作為參數傳遞給函數以及類似的任務非常重要:
$test_array = @() #создаем пустой массив
當數組初始化時,其值以逗號分隔(特殊運算符 ,)列出:
$test_array = @(1, 2, 3, 4) # создаем массив из четырех элементов
在大多數情況下,@() 運算符可以省略:
$test_array = 1, 2, 3, 4
在這種情況下,一個元素的數組初始化如下
$test_array = , 1
使用從零開始的整數索引和索引運算符(方括號)訪問數組元素:
$test_array[0] = 1
您可以指定多個以逗號分隔的索引,包括。 再次發生的:
$test_array = "один", "два", "три", "четыре"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]
操作者 ..
(兩個點 - 範圍運算符)返回指定上限和下限內的整數數組。 例如,表達式 1..4 輸出四個元素的數組 @(1, 2, 3, 4),表達式 8..5 輸出數組 @(8, 7, 6, 5)。
使用範圍運算符,可以初始化一個數組($test_array = 1..4)或獲取一個切片(slice),即一個數組中的元素序列以及另一個數組中的索引。 在本例中,負數 -1 表示數組的最後一個元素,-2 - 倒數第二個元素,依此類推。
$test_array = "один", "два", "три", "четыре"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]
請注意,整數數組值可以大於數據數組的最大索引值。 在這種情況下,所有值都返回到最後一個:
$test_array[0..100]
如果嘗試訪問單個不存在的數組元素,則返回 $null。
在 PowerShell 中,數組可以包含不同類型的元素或強類型的元素:
$test_array = 1, 2, "тест", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
Write-Host $test_array[$i]
}
其中 $test_array.count 屬性是數組元素的數量。
創建強類型數組的示例:
[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
哈希表
PowerShell 語言中另一種基本類型的變量是哈希表,也稱為關聯數組。 哈希表類似於 JSON 對象,並且基於鍵值構建。 與普通數組不同,它們的元素是通過命名鍵訪問的,這些鍵是對象的屬性(您也可以使用索引運算符 - 方括號)。
使用 @ 符號和運算符括號聲明一個空哈希表:
$test_hashtable = @{}
聲明時,可以立即創建鍵並為其賦值:
$test_hashtable = @{one="один"; two="два"; three="три"; "some key"="some value"}
要將一個元素添加到哈希表中,必須為其分配一個尚不存在的鍵,或者使用 Add() 方法。 如果對現有鍵進行分配,則其值將會更改。 Remove() 方法用於從哈希表中刪除元素。
$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "четыре")
$test_hashtable.five = "пять"
$test_hashtable['five'] = "заменяем значение"
$test_hashtable.Remove("one")
這種類型的變量可以作為參數傳遞給函數和 cmdlet - 在下一篇文章中,我們將研究如何完成此操作,並考慮另一種類似的類型 - PSCustomObject。
功能
PowerShell 擁有過程編程所需的一切,包括函數。 為了描述它們,使用功能詞 Function,之後您需要指定函數的名稱和括在運算符括號中的函數體。 如果需要向函數傳遞參數,可以在名稱後面的括號中立即指定它們。
function имя-функции (аргумент1, ..., аргументN)
{
тело-функции
}
該函數始終返回一個結果 - 如果有多個語句,它是所有語句結果的數組。 如果只有一條語句,則返回對應類型的唯一值。 return $value 構造將值為 $value 的元素添加到結果數組中併中止語句列表的執行,空函數返回 $null。
例如,讓我們創建一個用於對數字進行平方的函數:
function sqr ($number)
{
return $number * $number
}
請注意,在函數體中,您可以使用在調用它之前聲明的任何變量,並且在 PowerShell 中調用函數可能看起來不尋常:參數(如果有)不包含在括號中並用空格分隔。
sqr 2
或者像這樣:
sqr -number 2
由於參數傳遞方式的原因,函數本身有時需要用括號括起來:
function test_func ($n) {}
test_func -eq $null # функция не вызывалась
(test_func) -eq $null # результат выражения — $true
描述函數時,可以為參數分配默認值:
function func ($arg = value) {
#тело функции
}
還有另一種語法用於描述函數參數,此外,可以從管道讀取參數 - 所有這些都將在下一篇文章中派上用場,當我們查看導出的模塊並創建我們自己的 cmdlet 時。
錯誤處理
PowerShell 有一個 Try...Catch...Finally 機制來處理異常。 Try 塊包含可能發生錯誤的代碼,Catch 塊包含其處理程序。 如果沒有錯誤,則不會執行。 無論是否發生錯誤,Finally 塊都會在 Try 塊之後執行,並且可以有多個 Catch 塊來處理不同類型的異常。 異常本身被寫入未聲明的默認變量 ($_) 並且可以輕鬆檢索。 在下面的示例中,我們實現了防止輸入無效值的保護:
try {
[int]$test = Read-Host "Введите число"
100 / $test
} catch {
Write-Warning "Некорректное число"
Write-Host $_
}
對 PowerShell 語言編程基礎知識的回顧到此結束。 在接下來的文章中,我們將更詳細地研究如何使用不同類型的變量、集合、正則表達式、創建函數、模塊和自定義 cmdlet,以及面向對象的編程。
來源: www.habr.com