PowerShellの基本のキホン

Windows PowerShell実践システム管理ガイド 第3版 (TechNet ITプロシリーズ)

Windows PowerShell実践システム管理ガイド 第3版 (TechNet ITプロシリーズ)

1. PowerShell入門(制御)

1.1. スクリプトファイル

1.1.1. テスト用ファイル作成

main.ps1を作成します。

1.2. 変数

1.2.1. 定義

# [main.ps1]
$val = "test"
write $val;

$date = get-date
write $date

1.2.2. 配列

# [main.ps1]
# 定義
$arr = @()

# 追加
$arr += 1
$arr += 2

# 参照
write $arr[0]
write $arr[1]

# 結合
$aa = $arr -join "-"
write $aa

# 全ての要素を表示(1)
foreach($item in $arr){
    write $item
}

# 全ての要素を表示(2)
$arr | foreach { write $_ }

# 配列へ追加する[+=] は遅いので、速度を求める場合はListを使用
$list  = New-Object 'System.Collections.Generic.List[System.String]'
$list.Add(1)
$list.Add(2)

1.2.3. ハッシュ

# [main.ps1]
# 定義
$hash = @{}

# 設定
$hash["a"] = "hash-1"
$hash["b"] = "hash-2"
$hash["c"] = "hash-3"

# 参照
write $hash["a"]
write $hash["b"]
write $hash["c"]

# 削除
$hash.Remove("c")

# 全ての要素を参照
foreach($key in $hash.Keys){
    write $hash[$key]
}

# 存在確認
write $hash.Contains("a")
write $hash.Contains("c")

1.3. 演算子

1.3.1. 論理演算子

# [main.ps1]
$tt = (1 -eq 1)
$ff = (1 -eq 2)

# 論理和
$result = $tt -and $tt
write $result
> True

# 論理積
$result = $tt -or $ff
write $result
> True

# 論理否定
$result = -not $tt
write $result
> False

1.3.2. 比較演算子

# [main.ps1]
write (1 -eq 1)                   # True
write (1 -ne 2)                   # True
write (2 -gt 1)                   # True
write (1 -lt 2)                   # True
write ("cat'eye" -like "cat*")    # True ワイルドカード検索
write ("cat'eye" -match "^cat")   # True 正規表現検索

1.3.3. 範囲演算子

# [main.ps1]
1..3 | foreach {write $_}
>
 1
 2
 3

1.3.4. 置換演算子

# [main.ps1]
write ("flower" -replace "wer","rida")
> florida

1.3.5. 文字列演算子

# [main.ps1]
# 文字列を特定の文字で切り分けて配列を作る
$arr = "a,b,c" -split ","
write $arr[2]
> c

# 配列を特定の文字列を使って繋いで一つの文字列にする
$arr2 = $arr -join "#"
write $arr2
> a#b#c

1.3.6. 束縛演算子

# [main.ps1]
write (1,2,3,4,5 -contains 3)
> True

1.4. 制御

1.4.1. ifステートメント

# [main.ps1]
$v1 = 1

if ($v1 -eq 1)
{
    write "1"
}
elseif ($v1 -eq 2)
{
    write "2"
}
else
{
    write "1,2以外 "
}

1.4.2. switchステートメント

# [main.ps1]
$str2 = "apple"
switch($str2)
{
    "apple" {
        write "val:apple"
        }
    "orange" {
        write "val:orange"
        }
    default {
        write "val:other"
        }
}

1.4.3. whileステートメント

# [main.ps1]
$chk1 = 0;
while($chk1 -lt 3){
    write $chk1
    $chk1++
}

1.4.4. forステートメント

# [main.ps1]
for($i=0;$i -lt 3 ; $i++){
    write $i
}

1.4.5. foreachステートメント

# [main.ps1]
foreach ($item in 0..3){
    write $item
}

1.5. 関数

1.5.1. 関数定義

関数の基本的な記述。

# [main.ps1]
function test($price=100){
    return "price:"+ $price
}

$ret = test(300)
write $ret
> price:300

1.6. 定型処理

1.6.1. ファイルの読込み

ファイルの読込み定型処理。

# [main.ps1]
gc ./data.txt -Encoding utf8 | foreach {
    # 色々処理
    write $_
}

1.6.2. 他スクリプトのメソッドを実行

他のスクリプトファイルを読み込み、そちらに定義されているメソッドを実行します。

# [func.ps1]
# 定義
function funcA($msg){
    Write-Host $msg
}
# [main.ps1]
# 実行するスクリプトのパスから、相対のファイルを読み込む
. (@(Split-Path $myInvocation.MyCommand.path) + '\func.ps1')

# func.ps1の関数を呼び出す
funcA AABBCC

1.6.3. ハッシュのソート

# [main.ps1]

$s = @{Apple = 100; Melon = 90; Banana = 70}

# sort key
foreach($dd in $s.GetEnumerator() | sort Key ){
    Write-Host ($dd.Key + " -> " + $dd.Value)
}

# sort value
foreach($dd in $s.GetEnumerator() | sort -Descending Value){
    Write-Host ($dd.Key + " -> " + $dd.Value)
}

1.6.4. 進捗率表示

進捗率を表示する雛形処理。

# [main.ps1]
write "start"
$watch = New-Object System.Diagnostics.StopWatch
$watch.Start()
#----------------------------------------
# 進捗率
write "  処理1(進捗表示)"
$dataCount = 1000;
for($i=1 ;$i -lt $dataCount ;$i++){

    $per = ($i / $dataCount * 100)
    $per = [int]$per
    Write-Progress -Activity "データチェック" -PercentComplete $per -CurrentOperation "$per % 完了"
 }

#----------------------------------------
$watch.Stop()
$t = $watch.Elapsed
write done
write ----------------------
write ("execution time:" + ($t.TotalSeconds.ToString("0.000")) + " sec")

1.6.5. リンク一覧を取得

ページにあるリンク一覧を取得します。

# [main.ps1]
$uri = "http://www.yahoo.co.jp"
$rp = Invoke-WebRequest -Uri $uri -UseBasicParsing
$links = $rp.Links | Select-Object -ExpandProperty href 
$links | foreach {$_}

> 結果
https://www.yahoo-help.jp/
 :
 :

1.6.6. CSV処理

CSVの出力と読み込み

# [powershell]
> get-process | select -property Id,ProcessName,Cpu | export-csv -path process.log -notypeinformation

> 結果
"Id","ProcessName","CPU"
"4300","Agent","188.40625"
"7648","ApplicationFrameHost","1.109375"
"4032","armsvc","1.1875"
"14256","audiodg","0.109375"
 :
 :


>  import-csv .\process.log | where { $_.ProcessName -eq "chrome" } | where { $_.CPU -as [float] -gt 100
} | sort {$_.CPU -as [float]} -descending | select -first 5

> 結果
Id    ProcessName CPU
--    ----------- ---
23588 chrome      6418.6875
25280 chrome      5169.0625
20596 chrome      1843.890625
22936 chrome      994.140625
24764 chrome      822

Windows PowerShellクックブック

Windows PowerShellクックブック