什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

從歷史上看,Unix 系統上的命令行實用程序比 Windows 上的開發得更好,但隨著新解決方案的出現,情況發生了變化。

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

PowerShell 可以用解釋型多範式語言編寫腳本,該語言具有經典過程、面向對象甚至函數式編程的元素:條件分支、循環、變量、數組、哈希表、類、錯誤處理以及函數, cmdlet 和管道。 上一篇 致力於在該環境中工作的基礎知識,現在我們為讀者提供程序員的小指南。

目錄:

評論
變量及其類型
系統變量
範圍
環境變量(環境)
算術和比較運算符
賦值運算符
邏輯運算符
條件跳轉
週期
數組
哈希表
功能
錯誤處理

您可以在任何文本編輯器中或使用集成開發環境編寫代碼 - 最簡單的方法是使用 Microsoft 服務器操作系統附帶的 Windows PowerShell ISE。 這僅對於相當複雜的腳本是必要的:簡短的命令集更容易交互執行。

評論

使用註釋以及適當的縮進和空格被認為是良好編程風格的一部分:

# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.

<# 

       Так обозначаются начало и конец блочного комментария. 
       Заключенный между ними текст интерпретатор игнорирует.

#>

變量及其類型

PowerShell 中的變量是命名對象。 它們的名稱可以包含下劃線字符以及字母和數字。 $ 符號總是在名稱之前使用,並且要聲明一個變量,給解釋器一個有效的名稱就足夠了:

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

要初始化變量(為其賦值),請使用賦值運算符(符號 =):

$test = 100

您可以通過在名稱或值之前的方括號(類型轉換運算符)中指定變量的類型來聲明變量:

[int]$test = 100

$test = [int]100

重要的是要了解 PowerShell 中的變量是成熟的對象(類),其屬性和方法的類型基於 .NET Core 中的類型。 我們列出主要的:

類型(.NET 類)

描述

示例代碼

[字符串] 系統.字符串

統一碼字符串 

$測試=“測試”
$測試 = '測試'

[char]系統.Char

Unicode 字符(16 位)

[字符]$測試 = 'c'

[布爾] 系統布爾值

布爾類型(布爾 True 或 False)

[布爾]$測試=$真

[int] 系統.Int32

三十二位整數(32 位)

[int]$測試 = 123456789

[長] System.Int64

六十四位整數(64 位)

[長]$測試 = 12345678910

[單一] 系統.單一

浮點數 32 位長

[單個]$測試 = 12345.6789

[雙]系統.雙

長度為 64 位(8 字節)的浮點數

[雙]$測試= 123456789.101112

[十進制]System.Decimal

128位浮點數(要求以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

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

有許多用於操作變量的 cmdlet。 使用以下命令以方便的形式顯示它們的列表:

Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

要查看聲明的變量及其值,您可以使用特殊的 cmdlet:

Get-Variable | more

這種方法看起來過於麻煩,通過運算符或直接訪問變量的屬性和方法來處理變量要方便得多。 但是,cmdlet 有存在的權利,因為它們允許您設置一些附加參數。 重要的是要了解用戶變量僅在當前會話中定義。 當控制台關閉或腳本結束時,它們將被刪除。

系統變量

除了用戶聲明的變量之外,還有一些內置(系統)變量在當前會話結束後不會被刪除。 它們分為兩種類型,而PowerShell狀態數據存儲在自動變量中,不能自行為其分配任意值。 例如,這些包括 $PWD:

$PWD.Path

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

需要偏好變量來存儲用戶偏好,其值是可以改變的。 例如,$ErrorActionPreference 指定命令解釋器應如何響應非致命錯誤。

除了用於訪問聲明的變量的運算符和 cmdlet 之外,還有一個變量:偽累加器。 您可以通過與其他驅動器類比來使用它,這種情況下的變量類似於文件系統對象:

Get-ChildItem Variable: | more

ls Variable: | more

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

範圍

對於PowerShell中的變量,有作用域(Scope)的概念。 全局作用域(Global)的操作適用於整個當前會話——它包括例如係統變量。 局部(Local)變量僅在定義它們的範圍內可用:比如在函數內部。 還有腳本(Script)作用域的概念,但對於腳本命令來說,本質上是本地的。 默認情況下,在聲明變量時,它們被賦予局部作用域,要更改它,您需要一個特殊的構造,例如:$Global:variable=value。

例如,像這樣:

$Global:test = 100

環境變量(環境)

另一個偽驅動器 Env: 可從 PowerShell 獲得,可用於訪問環境變量。 當 shell 啟動時,它們是從父進程(即啟動當前會話的程序)複製的,通常它們的初始值與控制面板中的值相同。 要查看環境變量,請使用 Get-ChildItem cmdlet 或其別名(aliases):ls 和 dir。

dir Env:

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

這些變量是字節序列(或字符序列,如果您願意的話),其解釋僅取決於使用它們的程序。 *-Variable cmdlet 不適用於環境變量。 要訪問它們,您必須使用驅動器前綴:

$env:TEST = "Hello, World!"

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

算術和比較運算符

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]

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

操作者 .. (兩個點 - 範圍運算符)返回指定上限和下限內的整數數組。 例如,表達式 1..4 輸出四個元素的數組 @(1, 2, 3, 4),表達式 8..5 輸出數組 @(8, 7, 6, 5)。

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

使用範圍運算符,可以初始化一個數組($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。

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

在 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")

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

這種類型的變量可以作為參數傳遞給函數和 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

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

描述函數時,可以為參數分配默認值:

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 $_

}

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

對 PowerShell 語言編程基礎知識的回顧到此結束。 在接下來的文章中,我們將更詳細地研究如何使用不同類型的變量、集合、正則表達式、創建函數、模塊和自定義 cmdlet,以及面向對象的編程。

什麼是 Windows PowerShell?它與什麼一起使用? 第 2 部分:編程語言簡介

來源: www.habr.com

添加評論