Windows環境で自働化をしようと思ったら、ランタイムがいらなくて、OSの機能やHTTPリクエストできるのでPowerShellが便利。
たまにしか書かないので、すぐ思い出せるようにまとめておく。
cmd
で使っていたコンソールアプリと違い、PowerShell用に最適化されたものはコマンドレット
と呼ばれる。
コンソールアプリは出力がPowerShell内ではStringとして保持される。
対して、コマンドレットはObjectを返すことができる。
このObjectとかStringというのは.NETの共通言語ランタイム上のデータ。
そのため、共通言語ランタイム(C#とかVisual Basic)の関数を呼ぶこともできる。
コンソールアプリの出力はStringなので、Select-String
を使う。-Pattern
で正規表現マッチングできる。$ ipconfig | Select-String -Pattern 'IPv4'
エイリアスsls
でも使える。
さらに、-Pattern
は省略してもOK。$ ipconfig | sls 'IPv4'
複数の結果を返すコマンドレットに対して、filterをかけるにはWhere-Object
を使う。{}
に条件式を書く。$_
が仮引数となる。$ Get-ChildItem | Where-Object {$_.Name -Like "p*"}
エイリアスwhere
でも使える。$ Get-ChildItem | where {$_.Name -Like "p*"}
複数の結果を返すコマンドレットに対して、mapを実行するにはForEach-Object
を使う。{}
に条件式を書く。$_
が仮引数となる。$ ipconfig | sls 'IPv4' | ForEach-Object {"- " + $_}
エイリアス%
でも使える。$ ipconfig | sls 'IPv4' | % {"- " + $_}
複数の結果を返すコマンドレットに対して、sortをかけるにはSort-Object
を使う。
引数には前の結果のプロパティを指定する。$ Get-ChildItem | Sort-Object Name
エイリアスsort
でも使える。$ Get-ChildItem | sort Name
複数の結果を返すコマンドレットに対して、selectをかけるにはSelect-Object
を使う。
引数には前の結果のプロパティを指定する。$ Get-ChildItem | Select-Object Name
エイリアスselect
でも使える。$ Get-ChildItem | select Name
複数の結果を返すコマンドレットに対して、groupbyをかけるにはGroup-Object
を使う。
引数には前の結果のプロパティを指定する。$ Get-ChildItem | Group-Object Mode
エイリアスgroup
でも使える。$ Get-ChildItem | group Name
Get-Content
を使う。$ Get-Content -Path .\LineNumbers.txt
Out-File
を使う。$ Out-File -FilePath hoge.txt [-Append][-Encoding]
>
:ファイルへ出力(上書き)>>
:ファイルへ出力(追記)2>&1
:ファイル名の後に指定で、標準出力と標準エラー出力両方をリダイレクトする-eq
:等しい-ne
:等しくない-gt
:<
より大きい-ge
:<=
以上-lt
:>
より小さい-le
:>=
以下-like
:ワイルドカード使ったマッチング-notlike
:ワイルドカード使ったマッチングの否定-match
:正規表現使ったマッチング-notmatch
:正規表現使ったマッチングの否定-contains
:前置リストに後置アイテムが含まれているか-notcontains
:↑の否定-in
:前置アイテムに後置リストが含まれているか-notin
:↑の否定$ Invoke-WebRequest
を使う。Jsonのレスポンスだと、Object的にアクセスできる。
$LoginParameters = @{
Uri = 'https://www.contoso.com/login/'
SessionVariable = 'Session'
Method = 'POST'
Body = @{
User = 'jdoe'
Password = 'P@S$w0rd!'
}
}
$LoginResponse = Invoke-WebRequest @LoginParameters
$ProfileResponse = Invoke-WebRequest 'https://www.contoso.com/profile/' -WebSession $Session
Write-Host $ProfileResponse.prop
Add-type -assembly "System.Windows.Forms"
[System.Windows.Forms.MessageBox]::Show("!!!!")
Param()
を使う。Param( [string]$aaa, [int]$bbb )
型の指定はなくてもいい。
先頭にコメント書くとGet-Help
で読んでくれる。
<#
.SYNOPSIS
Adds a file name extension to a supplied name.
.DESCRIPTION
Adds a file name extension to a supplied name.
Takes any strings for the file name or extension.
.PARAMETER Name
Specifies the file name.
.PARAMETER Extension
Specifies the extension. "Txt" is the default.
.INPUTS
None. You cannot pipe objects to Add-Extension.
.OUTPUTS
System.String. Add-Extension returns a string with the extension or file name.
.EXAMPLE
PS> extension -name "File"
File.txt
.EXAMPLE
PS> extension -name "File" -extension "doc"
File.doc
.EXAMPLE
PS> extension "File" "doc"
File.doc
.LINK
Online version: http://www.fabrikam.com/extension.html
.LINK
Set-Item
#>
引数間違ったときに、自分でGet-Help
起動してやるといい。
$ScriptFullName = $MyInvocation.MyCommand.Path
Get-Help $ScriptFullName
Function SayHello($name){
Write-Host "Hello $name!"
}
PSScriptAnalyzerというのがある。
lspサーバもある。
filterとかmapとかをパイプで繋いでくのは、関数型プログラミングっぽくて楽しい。
楽しいと思えるようになったのも、関数型プログラミングの考え方が理解できてきたからだと感じた。