データ格納 変数 変数とは、文字や数字などのデータを格納する入れ物のことです。
変数は必ず$記号で始まり、文字、数字、記号、スペースを組み合わせて指定します。
$var = "Test"
配列 配列とは、文字や数字などのデータを格納する複数のまとまった入れ物のことです。インデックスと呼ばれる番号(0~4)で、それぞれのデータを区別します。
配列は@() の中にカンマ区切りでデータを入力します。$Team = @("Aさん", "Bさん", "Cさん", "Dさん", "Eさん")
任意のデータを取得する場合はインデックス番号を使用します。$Team[0] Aさん
連想配列 連想配列とは、文字や数字などのデータを格納する複数のまとまった入れ物のことです。キーと呼ばれる識別子で、それぞれのデータを区別します。
連想配列は@{} の中にキー値とデータをセットにしてセミコロン区切りで入力します。$Profile= @{"Name" = "Aさん"; "Age" = 20; "Male" = "男性"}
任意のデータを取得する場合はキー値を使用します。$Profile["Age"] 20
演算子 算術演算子 演算子 説明 + 加算、プラス - 減算、マイナス * 乗算 / 除算 % 余剰
配列と文字列については、「+」と「*」の演算子の内容がオーバーロードされています。 そのため、配列の「+」は要素の追加、「*」は要素の繰り返し、文字列の「+」は結合、「*」は文字列の繰り返しになります。
#配列の加算、乗算
(1,2) + 3
1
2
3
(1,2) * 3
1
2
1
2
1
2
#文字列の加算、乗算
"abc" + 2
abc2
"abc" * 2
abcabc
代入演算子 演算子 説明 = 代入 += 加算して代入 -= 減算して代入 *= 乗算して代入 /= 除算して代入 %= 余剰を求めて代入 ++ インクリメント -- デクリメント
論理演算子 演算子 説明 -or 論理和 -and 論理積 -xor 排他的論理和 -not 否定
比較演算子 演算子 説明 -eq 等しい -ne 等しくない -gt より大きい(>) -ge 以上(>=) -lt より小さい(<) -le 以下(<=) -like ワイルドカードと等しい -match 正規表現と等しい -contains 配列に含まれる -in 配列に含まれる
演算子は大文字小文字を区別しません。大文字小文字を区別する場合は、-ceq のように 頭にc をつけてください。
「contains」と「in」の違いは、配列を左にとるか右にとるかの違いしかありません。
if ($colors -in @('青', '黄', '赤')) {
# $colors の中に青、黄、赤があれば
}
if (@('青', '黄', '赤') -contains $colors) {
# 青、黄、赤が $colorsに含まれていたら
}
制御構文 if 処理を分岐します。
構文
if (<条件>) { } elseif (<条件>) { } else { <前の条件が満たされない場合に実行> }
サンプル
$var = 1 if ($var -eq 1) { Write-Host "数字は1です。" } elseif ($var -eq 2) { Write-Host "数字は2です。" } else { Write-Host "その他の数字です。" }
数字は1です。
For 指定した条件で繰り返します。
構文
for (<初期化>; <条件>; <繰り返し処理>) { <繰り返し実行する処理> }
サンプル
for ( $i = 0; $i -lt 5; $i++ ) { Write-Host ("No: $i") }
No: 0 No: 1 No: 2 No: 3 No: 4
while 指定した条件が真(True)の場合に繰り返します。条件は最初に判断されます。
構文
while (条件) { <繰り返し実行する処理> }
サンプル
$i = 0 while ( $i -lt 5 ) { Write-Host "No: $i" $i++ }
No: 0 No: 1 No: 2 No: 3 No: 4
Do/While 指定した条件が真(True)の場合に繰り返します。条件は最後に判断されます。
構文
do { <繰り返し実行する処理> } while (条件)
サンプル
$i = 0 do { Write-Host "No: $i" $i++ } while ($i -lt 5)
No: 0 No: 1 No: 2 No: 3 No: 4
ForEach コレクションに含まれるすべての項目を順番に処理します。
構文
foreach ($<項目> in $<コレクション>) { <繰り返し実行する処理> }
サンプル
$array = @(1,2,3,4,5) $sum=0 foreach ($val in $array) { $sum += $val } Write-Host $sum
15
Switch 処理を分岐します。
構文
switch -options (評価する式) { <パターン> {実行する処理} <パターン> {実行する処理} ・・・ default {実行する処理} }
サンプル
$Year = 2020 switch ( $Year ) { 2019 { Write-Host "昨年"; break } 2020 { Write-Host "今年"; break } 2021 { Write-Host "来年"; break } default { Write-Host "その他" } }
今年
オブジェクトの操作 Select-Object プロパティを選択する
get-service | select DisplayName, Status, StartType
DisplayName Status StartType
----------- ------ ---------
Adobe Acrobat Update Service Running Automatic
AllJoyn Router Service Stopped Manual
Application Layer Gateway Service Stopped Manual
・・・
プロパティを全選択する
get-service | select *
Name : AdobeARMservice
RequiredServices : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : True
DisplayName : Adobe Acrobat Update Service
DependentServices : {}
MachineName : .
ServiceName : AdobeARMservice
ServicesDependedOn : {}
ServiceHandle :
Status : Running
ServiceType : Win32OwnProcess
StartType : Automatic
Site :
Container :
・・・
件数を指定する
最初のデータを取得する場合は、「First」、最後のデータを取得する場合は、「Last」を使用します。
get-service | select -First 5
Status Name DisplayName
------ ---- -----------
Running AdobeARMservice Adobe Acrobat Update Service
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
Running Amsp Trend Micro Solution Platform
Stopped AppIDSvc Application Identity
・・・
任意のデータを追加する
任意の項目を追加することができます。最後の項目にチェックした日時を追加します。
get-service | select DisplayName, Status, StartType,@{Name="DateTime"; Expression= {(Get-Date).ToString("yyyy/MM/dd HH:mm:ss")}}
DisplayName Status StartType DateTime
----------- ------ --------- --------
Adobe Acrobat Update Service Running Automatic 2020/04/05 21:31:33
AllJoyn Router Service Stopped Manual 2020/04/05 21:31:33
Application Layer Gateway Service Stopped Manual 2020/04/05 21:31:33
Trend Micro Solution Platform Running Automatic 2020/04/05 21:31:33
Application Identity Stopped Manual 2020/04/05 21:31:33
・・・
処理した結果を追加する
自動サービスで起動していないサービスをチェックし、結果を追加します。
get-service | select DisplayName, Status, StartType,@{Name="Result"; Expression={if($_.StartType -eq "Automatic" -and $_.Status -ne "Running"){"チェック必要"}}}
DisplayName Status StartType Result
----------- ------ --------- ------
Adobe Acrobat Update Service Stopped Automatic チェック必要
AllJoyn Router Service Stopped Manual
Application Layer Gateway Service Stopped Manual
Trend Micro Solution Platform Running Automatic
Application Identity Stopped Manual
・・・
Where-Object オブジェクトを指定した条件で抽出します。
指定した条件で抽出する
サービス名が「win」を含むものを抽出します。エイリアスの「?」を使っています。
get-service | ? {$_.Name -like "*win*"}
Status Name DisplayName
------ ---- -----------
Stopped tcsd_win32.exe Security Innovation TCS
Stopped WinDefend Windows Defender Antivirus Service
Running WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running Winmgmt Windows Management Instrumentation
Stopped WinRM Windows Remote Management (WS-Manag...
Group-Object 指定したプロパティをグルーピングしアイテム数をカウントします。
指定した条件でグループ化する
サービスのステータスでグルーピングします。
get-service | group status
Count Name Group
----- ---- -----
123 Running {AdobeARMservice, Amsp, Appinfo, Apple Mobile Device Service...}
170 Stopped {AJRouter, ALG, AppIDSvc, AppMgmt...}
Sort-Object オブジェクトのデータを並び替えます。
指定した条件で並び替える
Windows のプロセスを CPUでソート(降順)し最初の 10 件を表示します。
Get-Process | select -First 10 | sort cpu -Descending
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
680 131 975116 447616 4,511.52 5900 15 chrome
4589 342 284540 312416 4,345.38 9260 15 chrome
519 31 63496 69576 511.39 7920 15 chrome
599 17 24104 29960 291.19 22008 0 audiodg
553 39 185164 175176 155.31 13668 15 B2
413 40 391232 437164 95.88 6364 15 chrome
361 24 11372 10308 83.36 9024 15 chrome
463 29 22144 31344 4.22 6004 15 ApplicationFrameHost
269 20 16216 27244 0.13 7940 15 chrome
292 22 4992 5892 4724 0 AppleMobileDeviceService
ForEach-Object オブジェクトのデータを繰り返し処理します。
オブジェクトのデータを1つずつ書き出す(ForEach-Object)
C:\tempには、5つのテキストファイル(test1.txt~test5.txt)が保存されています。これをリスト表示します。エイリアスの「%」を使っています。
Get-ChildItem c:\temp | % {Write-Host $_}
test1.txt
test2.txt
test3.txt
test4.txt
test5.txt
上記はforeachステートメントを使用することもできます。
オブジェクトのデータを1つずつ書き出す(ForEachステートメント)
$files = Get-ChildItem c:\temp
foreach($file in $files){
Write-Host $file
}
test1.txt
test2.txt
test3.txt
test4.txt
test5.txt
ForEach-Objectとforeachステートメントはメモリの利用方法に差があります。
ForEach-Objectでは受け取ったオブジェクトを1つずつメモリに読み込んで処理されます。そのため、利用するメモリの量は少ないのですが、処理スピードは遅いです。
foreachステートメントは受け取った配列の要素を全てメモリに読み込んでから処理されます。そのため、利用するメモリの量は多いのですが、処理スピードは速いです。
オブジェクトの出力 Format-Table(ft) プロパティをテーブル形式で表示します。-AutoSize を使うと項目幅が自動調整されます。
get-service | ft -AutoSize
Status Name DisplayName
------ ---- -----------
Running AdobeARMservice Adobe Acrobat Update Service
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
・・・
Format-List(fl) プロパティをリスト形式で表示します。表示が長いプロパティを見たいときに便利です。
get-service | fl
Name : AdobeARMservice
DisplayName : Adobe Acrobat Update Service
Status : Running
DependentServices : {}
ServicesDependedOn : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : True
ServiceType : Win32OwnProcess
Name : AJRouter
DisplayName : AllJoyn Router Service
Status : Stopped
DependentServices : {}
ServicesDependedOn : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
ServiceType : Win32ShareProcess
Name : ALG
DisplayName : Application Layer Gateway Service
Status : Stopped
DependentServices : {}
ServicesDependedOn : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
ServiceType : Win32OwnProcess
・・・
Out-GridView プロパティをグリッドビューで表示します。
get-service | select DisplayName, Status, StartType | Out-GridView
CSV CSV形式でオブジェクトをエクスポートします。
get-service | Export-Csv -path C:\temp\service.csv -Encoding Default
Clip クリップボードにコピーします。
Get-ChildItem c:\temp | Clip