PowerShellの基本知識

スポンサーリンク

データ格納

変数

変数とは、文字や数字などのデータを格納する入れ物のことです。

変数は必ず$記号で始まり、文字、数字、記号、スペースを組み合わせて指定します。

$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