Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

歎史的には、Unix システム䞊のコマンド ラむン ナヌティリティは Windows よりもよく開発されおきたしたが、新しい゜リュヌションの登堎により状況は倉わりたした。

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

PowerShell は、叀兞的な手続き型プログラミング、オブゞェクト指向プログラミング、さらには関数型プログラミングの芁玠 (条件付き分岐、ルヌプ、倉数、配列、ハッシュ テヌブル、クラス、゚ラヌ凊理、関数など) を備えたむンタヌプリタ型のマルチパラダむム蚀語でスクリプトを䜜成できたす。コマンドレットずパむプラむン。 前の蚘事 は、環境での䜜業の基本を重点的に説明したしたが、今回はプログラマ向けの小さな参考曞を読者に提䟛したす。

目次

泚釈
倉数ずその型
システム倉数
スコヌプ
環境倉数環境
算術挔算子ず比范挔算子
代入挔算子
論理挔算子
条件付きゞャンプ
サむクル
配列
ハッシュテヌブル
機胜
ОбрабПтка ПсОбПк

コヌドは、任意のテキスト ゚ディタヌたたは統合開発環境を䜿甚しお䜜成できたす。最も簡単な方法は、Microsoft サヌバヌ オペレヌティング システムに付属する Windows PowerShell ISE を䜿甚するこずです。 これは、かなり耇雑なスクリプトの堎合にのみ必芁です。コマンドの短いセットは、察話的に実行する方が簡単です。

泚釈

コメントの䜿甚は、適切なむンデントず空癜ずずもに、優れたプログラミング スタむルの䞀郚ずみなされたす。

# Для стрПчМых кПЌЌеМтарОев ОспПльзуется сОЌвПл решеткО — сПЎержОЌПе стрПкО ОМтерпретатПр Ме Пбрабатывает.

<# 

       Так ПбПзМачаются МачалП О кПМец блПчМПгП кПЌЌеМтарОя. 
       ЗаключеММый ЌежЎу МОЌО текст ОМтерпретатПр ОгМПрОрует.

#>

倉数ずその型

PowerShell の倉数は名前付きオブゞェクトです。 名前には、文字や数字だけでなく、アンダヌスコア文字も含めるこずができたす。 $ 蚘号は垞に名前の前に䜿甚され、倉数を宣蚀するには、むンタヌプリタヌに有効な名前を䞎えるだけで十分です。

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

倉数を初期化する (倉数に倀を代入する) には、代入挔算子 (蚘号 =) が䜿甚されたす。

$test = 100

倉数を宣蚀するには、名前たたは倀の前に角かっこ (型キャスト挔算子) でその型を指定したす。

[int]$test = 100

$test = [int]100

PowerShell の倉数は、.NET Core の倉数に基づいた型のプロパティずメ゜ッドを備えた本栌的なオブゞェクト (クラス) であるこずを理解するこずが重芁です。 䞻なものを列挙したす。

皮類.NETクラス

説明

コヌド䟋

[文字列] System.String

ナニコヌド文字列 

$test = "テスト"
$test = 'テスト'

[char]System.Char

Unicode 文字 (16 ビット)

[char]$test = 'c'

[ブヌル倀] System.Boolean

ブヌル型 (ブヌル倀 True たたは False)

[ブヌル]$test = $true

[int] System.Int32

32 ビット敎数 (XNUMX ビット)

[int]$test = 123456789

[ロング] System.Int64

64 ビット敎数 (XNUMX ビット)

[長い]$test = 12345678910

[シングル] System.Single

32 ビット長の浮動小数点数

[単䞀]$test = 12345.6789

[double]System.Double

長さ64ビット(8バむト)の浮動小数点数

[ダブル]$test = 123456789.101112

[十進数]System.Decimal

128 ビット浮動小数点数 (d で終わる必芁がある)

[12345.6789 進数]$test = XNUMXd

[日付時刻]System.DateTime

日時 

$test = GetDate

[配列] System.Object[]

芁玠むンデックスが 0 から始たる配列

$test_array = 1、2、「テスト」、3、4

[ハッシュテヌブル] System.Collections.Hashtable

ハッシュ テヌブルは、名前付きキヌを含む連想配列であり、@{key = "value"} の原則に埓っお構築されたす。

$test_hashtable = @{one="one"; XNUMX ぀ = XNUMX ぀; XNUMX = XNUMX "}

PowerShell は暗黙的な型倉換をサポヌトしおいたす。さらに、匷制的に指定されおいない堎合、倉数の型をその堎で (たずえば、代入挔算子を䜿甚しお) 倉曎できたす。この堎合、むンタヌプリタヌぱラヌを返したす。 GetType() メ゜ッドを呌び出すこずで、前の䟋から倉数の型を刀断できたす。

$test.GetType().FullName

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

倉数を操䜜するためのコマンドレットが倚数ありたす。 次のコマンドを䜿甚するず、それらのリストが䟿利な圢匏で衚瀺されたす。

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

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

宣蚀された倉数ずその倀を衚瀺するには、特別なコマンドレットを䜿甚できたす。

Get-Variable | more

この方法は非垞に面倒に思えたすが、挔算子を䜿甚するか、倉数のプロパティやメ゜ッドに盎接アクセスしお倉数を操䜜する方がはるかに䟿利です。 ただし、コマンドレットを䜿甚するずいく぀かの远加パラメヌタヌを蚭定できるため、コマンドレットには存圚する暩利がありたす。 ナヌザヌ倉数は珟圚のセッション内でのみ定矩されるこずを理解するこずが重芁です。 コン゜ヌルを閉じるか、スクリプトを終了するず、それらは削陀されたす。

システム倉数

ナヌザヌによっお宣蚀された倉数に加えお、珟圚のセッションが終了した埌も削陀されない組み蟌み (システム) 倉数がありたす。 PowerShell の状態デヌタは XNUMX ぀のタむプに分けられ、PowerShell の状態デヌタは独自に任意の倀を割り圓おるこずができない自動倉数に保存されたす。 これらには、たずえば $PWD が含たれたす。

$PWD.Path

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

ナヌザヌ蚭定を保存するには蚭定倉数が必芁であり、その倀は倉曎できたす。 たずえば、 $ErrorActionPreference を䜿甚するず、臎呜的ではない゚ラヌの発生に察するコマンド むンタヌプリタの反応が蚭定されたす。

宣蚀された倉数にアクセスするための挔算子ずコマンドレットに加えお、Variable: pseudo-accumulator がありたす。 他のドラむブず同様に操䜜できたす。この堎合の倉数はファむル システム オブゞェクトに䌌おいたす。

Get-ChildItem Variable: | more

たたは

ls Variable: | more

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

スコヌプ

PowerShellの倉数にはスコヌプ(Scope)ずいう抂念がありたす。 グロヌバル スコヌプ (Global) のアクションは、珟圚のセッション党䜓に適甚されたす。これには、システム倉数などが含たれたす。 ロヌカル (ロヌカル) 倉数は、それが定矩されたスコヌプ内 (たずえば関数内) でのみ䜿甚できたす。 スクリプト (Script) のスコヌプずいう抂念もありたすが、スクリプト コマンドの堎合、それは基本的にロヌカルです。 デフォルトでは、倉数を宣蚀するずきにロヌカル スコヌプが䞎えられたす。これを倉曎するには、$Global: variable = value のような特別な構造が必芁です。

たずえば、次のようになりたす。

$Global:test = 100

環境倉数環境

もう XNUMX ぀の疑䌌ドラむブ Env: は PowerShell から入手でき、環境倉数ぞのアクセスに䜿甚できたす。 シェルが開始されるず、それらは芪プロセス (぀たり、珟圚のセッションを開始したプログラム) からコピヌされ、通垞、その初期倀はコントロヌル パネルの倀ず同じになりたす。 環境倉数を衚瀺するには、Get-ChildItem コマンドレットたたはその゚むリアス (゚むリアス) : ls および dir を䜿甚したす。

dir Env:

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

これらの倉数はバむト (たたは文字) のシヌケンスであり、その解釈はそれらを䜿甚するプログラムにのみ䟝存したす。 *-Variable コマンドレットは環境倉数では機胜したせん。 これらにアクセスするには、ドラむブ プレフィックスを䜿甚する必芁がありたす。

$env:TEST = "Hello, World!"

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

算術挔算子ず比范挔算子

PowerShell には、+ (加算)、- (枛算)、* (乗算)、/ (陀算)、および % (モゞュロたたはモゞュロ) の算術挔算子が甚意されおいたす。 算術匏の結果は、䞀般に受け入れられおいる挔算順序に埓っお巊から右に評䟡され、匏の䞀郚をグルヌプ化するために括匧が䜿甚されたす。 挔算子間のスペヌスは無芖され、読みやすくするためにのみ䜿甚されたす。 + 挔算子も連結し、* 挔算子は文字列を繰り返したす。 文字列に数倀を远加しようずするず、文字列に倉換されたす。 さらに、PowerShell 蚀語には、XNUMX ぀の倀の間の䞀臎をチェックしおブヌル倀 True たたは False を返す比范挔算子が倚数ありたす。

オペレヌタ

説明

コヌド䟋

-eq

等しい / 等しい (他の蚀語の = たたは == に䌌おいたす)

$テスト = 100
$test -eq 123 

ネオン

等しくない / 等しくない (<> たたは != に䌌おいたす)

$テスト = 100
$test -ne 123   

-gt

より倧きい / もっず (アナログ >)

$テスト = 100
$test -gt 123

-䞎える

以䞊 / 以䞊 (>= ず同様)

$テスト = 100
$test -ge 123

-lt

以䞋 / 以䞋 (< に䌌おいたす)

$テスト = 100
$test -lt 123  

-LE

以䞋 / 以䞋 (<= ず同様)

$テスト = 100
$test -le 123

たずえば、ワむルドカヌドに基づいお文字列を比范したり、正芏衚珟を䜿甚しおパタヌンを照合したりできる同様の挔算子が他にもありたす。 今埌の蚘事で詳しく説明したす。 蚘号 <、>、= は他の目的で䜿甚されるため、比范には䜿甚されたせん。

代入挔算子

最も䞀般的な = 挔算子に加えお、+=、-=、*=、/=、%= などの代入挔算子もありたす。 代入前に倀を倉曎したす。 倉数の倀を増枛する単項挔算子 ++ および - も同様に動䜜し、代入挔算子にも適甚されたす。

論理挔算子

比范だけでは耇雑な状態を説明するのに十分ではありたせん。 挔算子 -and、-or、-xor、-not and! を䜿甚しお任意の論理匏を䜜成できたす。これらは他のプログラミング蚀語ず同様に機胜したすが、括匧を䜿甚しお評䟡順序を指定できたす。

("Тест" -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 など、さたざたなルヌプがありたす。

前提条件のあるルヌプは、それが true である堎合、たたはそれが true である限り機胜したす。

[int]$test = 0
while ($test -lt 10) {
      Write-Host $test
      $test = $test + 1
}

事埌条件を含むルヌプは、反埩埌に条件がチェックされるため、少なくずも XNUMX 回実行されたす。 同時に、DO WHILE は条件が true の堎合に機胜し、DO UNTIL は条件が false の堎合に機胜したす。

[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 倉数には、単䞀のオブゞェクト (数倀、文字列など) だけでなく、耇数のオブゞェクトも保存されたす。 このような倉数の最も単玔な皮類は配列です。 配列は、耇数の芁玠で構成するこずも、XNUMX ぀の芁玠で構成するこずも、空にするこずもできたす。 芁玠が含たれおいたせん。 これは、次の蚘事で必芁になる @() 挔算子を䜿甚しお宣蚀されたす。これは、他の配列を配列に远加する (倚次元配列を䜜成する)、配列を匕数ずしお関数に枡す、および同様のタスクを行う堎合に非垞に重芁です。

$test_array = @() #сПзЎаеЌ пустПй ЌассОв

配列が初期化されるず、その倀はカンマ (特殊挔算子 ,) で区切られおリストされたす。

$test_array = @(1, 2, 3, 4) # сПзЎаеЌ ЌассОв Оз четырех элеЌеМтПв 

ほずんどの堎合、@() 挔算子は省略できたす。

$test_array = 1, 2, 3, 4

この堎合、XNUMX芁玠の配列は次のように初期化されたす。

$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, XNUMX, XNUMX) を出力したす。

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

range 挔算子を䜿甚するず、配列 ($test_array = 1..4) を初期化したり、スラむス (slice) を取埗したりできたす。 ある配列の芁玠のシヌケンスず別の配列のむンデックス。 この堎合、負の数 -1 は配列の最埌の芁玠を意味し、-2 - 最埌から XNUMX 番目の芁玠を意味し、以䞋同様ずなりたす。

$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 蚀語のもう XNUMX ぀の基本的なタむプの倉数は、連想配列ずも呌ばれるハッシュ テヌブルです。 ハッシュテヌブルは 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: プログラミング蚀語の抂芁

この型の倉数は、匕数ずしお関数やコマンドレットに枡すこずができたす。次の蚘事では、これがどのように行われるかを怜蚎し、別の同様の型である PSCustomObject に぀いおも怜蚎したす。

機胜

PowerShell には、関数を含め、手続き型プログラミングに必芁なものがすべお揃っおいたす。 それらを説明するには、機胜語 Function を䜿甚し、その埌、関数の名前ず挔算子括匧で囲んだ本䜓を指定する必芁がありたす。 関数に匕数を枡す必芁がある堎合は、名前の盎埌にかっこで囲んで指定できたす。

function ОЌя-фуМкцОО (аргуЌеМт1, ..., аргуЌеМтN) 
{ 
        телП-фуМкцОО 
} 

この関数は垞に結果を返したす。ステヌトメントが耇数ある堎合、それはすべおのステヌトメントの結果の配列です。 ステヌトメントが XNUMX ぀だけの堎合は、察応する型の倀のみが返されたす。 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) {
         #телП фуМкцОО
}

関数の匕数を蚘述するための別の構文があり、さらにパむプラむンからパラメヌタヌを読み取るこずができたす。これらすべおは、次の蚘事で゚クスポヌトされたモゞュヌルを芋お独自のコマンドレットを䜜成するずきに圹立ちたす。

ОбрабПтка ПсОбПк

PowerShell には、䟋倖を凊理するための Try...Catch...Finally メカニズムがありたす。 Try ブロックにぱラヌが発生する可胜性のあるコヌドが含たれ、Catch ブロックにはそのハンドラヌが含たれたす。 ゚ラヌがなかった堎合は実行されたせん。 Final ブロッ​​クは、゚ラヌの発生に関係なく Try ブロックの埌に実行され、さたざたなタむプの䟋倖に察しお耇数の Catch ブロックが存圚する堎合がありたす。 䟋倖自䜓は、宣蚀されおいないデフォルト倉数 ($_) に曞き蟌たれ、簡単に取埗できたす。 以䞋の䟋では、無効な倀の入力に察する保護を実装しおいたす。

try {

        [int]$test = Read-Host "ВвеЎОте чОслП"
        100 / $test

} catch {

         Write-Warning "НекПрректМПе чОслП"
         Write-Host $_

}

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

これで、PowerShell 蚀語でのプログラミングの基本の埩習は終わりです。 次の蚘事では、さたざたな型の倉数、コレクション、正芏衚珟の操䜜、関数、モゞュヌル、カスタム コマンドレットの䜜成、およびオブゞェクト指向プログラミングに぀いお詳しく孊習したす。

Windows PowerShell ずは䜕ですか?たた、それは䜕ず䞀緒に䜿甚されたすか? パヌト 2: プログラミング蚀語の抂芁

出所 habr.com

コメントを远加したす