2016-05-24

PowerShellに入門してみた

PowerShellが便利だということに今さら気づいたので、使い方をざっとまとめましたー

PowerShellの起動・設定

Window + R → powershellで検索・起動

PowerShell ISE(エディタ)の呼び出し

ise

現在のスクリプト実行ポリシーの参照(ps1ファイルを実行するポリシー)

Get-ExecutionPolicy

スクリプト実行ポリシーの設定(管理者権限でPowerShellを起動して実行)

Set-ExecutionPolicy RemoteSigned

基本文法

変数代入
$hoge = "fuga"
[int]$int = 3
$bool = $TRUE # $FALSE

配列、マップ

$ary = @(100,120,300)
$hash = @{ "aaa" = "bbb";"ccc" = $TRUE;}

分岐

$x = "hoge"
if ($x -eq "hoge") {
  Write-Output "hoge!!"
} else {
  Write-Output "fuga!!"
}

switch($x) {
  "hoge" {
    Write-Output "hoge-switch"
  }
  "fuga" {
    Write-Output "fuga-switch"
  }
  default {
    Write-Output "other"
  }
}

ループ

$ary=@(100,120,300)
for($i=0; $i -lt 3; $i++){
  # break
  # continue
  Write-Output $ary[$i]
}

foreach($dat in $ary){
  Write-Output ($dat * 2)
}

$i = 0
while($i -ne 5) {
  Write-Output ($i)
  $i++
}

コメントアウト

# 一行コメントアウト
<#複数行コメントアウト
aaa
bbb
#>

プロパティの参照

$a.fuga
$a.$("fuga") # $a.fugaと同じ

コマンドの引数の参照

$Args # $Args[0], $Args[1], ...

関数

function aaa([int]$i=2) { # [type]variable=default
  return ("hoge" + $i)
}
aaa 3 # 呼び出し

良く使いそうなコマンドレット

ファイル入出力
Write-Output "hogeあああ" | Out-File .\hogehoge.txt -Encoding utf8 # write
$hoge = Get-Content ./hogehoge.txt # read

JSONコンバート

ConvertTo-Json(@{"hoge"="fuga";"aaa"=2;"BBB"=$TRUE})
$a = ConvertFrom-Json('{"hoge": true, "fuga": "aaa"}')
$a.hoge

HTTPリクエスト

$response = ConvertTo-JSON(@{"aaa"="bbb";"ccc"=$TRUE}) | 
%{curl -Method POST -Headers @{"ContentType" = "application/json"} `
-Body $_ "{endpoint}"}
Write-Output $response.StatusCode
Write-Output $response.Headers
Write-Output $response.Content

SalesforceのSOAP APIを叩く

C#だとサービス参照とかでWSDLファイルを読みこませるのが面倒だったりしますが、PowerShellだとスクリプトレベルでWSDLの読み込みができるので楽です。ISEでもちゃんとインテリセンスが効きます。
$URI = "path/to/wsdl"
$username = "{username}"
$password = "{password}"

$sf = New-WebServiceProxy -Uri $URI -Namespace sf -UseDefaultCredential
$LoginResponse = $sf.login($username, $password)
$newURL = $LoginResponse.serverUrl
$newSession = $LoginResponse.sessionId

$sf = New-Object sf.SforceService
$sf.Url = $newURL
$sf.SessionHeaderValue = New-Object sf.SessionHeader
$sf.SessionHeaderValue.sessionId = $newSession
$soapQuery = $sf.query("SELECT Id, LastName, FirstName FROM Contact")
foreach ($record in $soapQuery.records) {
  $fields = @{}
  foreach ($field in $record.Any) {
    $fields[$field.LocalName] = $field.InnerText
  }
  ConvertTo-Json $fields
}
$sf.logout()

所感

個人的にはWindowsでもVM立ち上げてLinux環境で色々動かしてたり、Windowsの操作を自動化することも要求されないので、ローカルで動かすときにPowerShellがそこまで必要かと言われると微妙ですが、そうじゃない非エンジニアな人に作業効率Upスクリプトを渡すときには便利そうです。また監視プログラムのような数十行レベルのライトなバッチ処理を組みたい場合にも、ビルドせずに.NETのライブラリを使えるのはかなり便利です。パイプはLinuxと違ってオブジェクトを渡す仕組みで、使いこなすと便利なんだろうなーという印象。NTFSのACLもicaclsコマンドでやるよりはPowerShellでやった方が良さそう。

参考URL

このエントリーをはてなブックマークに追加