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()