| SU | MO | TU | WE | TH | FR | SA |
|---|---|---|---|---|---|---|
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
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とかをパイプで繋いでくのは、関数型プログラミングっぽくて楽しい。
楽しいと思えるようになったのも、関数型プログラミングの考え方が理解できてきたからだと感じた。