Kodama's home / tips.
PowerShell 関連の文法事項
- スクリプトファイル
- 実行ポリシーを設定
- 変数
- オブジェクト指向
- パイプ処理
- 型キャスト
- ヒアドキュメント
- 関数
- 配列
- ハッシュテーブル/連想配列
- 条件分岐
- 繰り返し
PowerShell スクリプトの文法事項を中心としたメモ.
拡張子 .ps2 でスクリプトファイルを作成する.
- # コメント
- コマンド名の大文字/小文字の別は無視される.
- 文字コードは Unicode/UTF8
- 改行コードは windows形式 (CRLF)
デフォルトでは安全のためスクリプトファイルは実行禁止になっている.
スクリプトを実行する前に実行ポリシーを設定する.
コマンドラインで設定の例.
Set-ExecutionPolicy Unrestricted
#Unrestricted, RemoteSigned
スクリプト実行時に指定の例.
PowerShell -ExecutionPolicy Unrestricted -File sample-script.ps1
- 変数名 $[a-zA-Z0-9_]*
- 自動変数 $Args
$Args[0]
- $スコープ修飾子:変数名 で変数のスコープを指定することができる (global、script、local)
$global:x
$script:y
$local:z
コマンドの結果, 変数の値などはすべてオブジェクト.
- Import-Module モジュール/クラスライブラリの読み込み. 使用前に追加で読み込みが必要なクラスもある.
Import-Module ActiveDirectory
- GetType() 型を得る:
$hoge.gettype()
- 生成
$x = New-Object クラスの完全修飾名(引数,...)
$x = New-Object [-typeName] クラスの完全修飾名 [[-argumentList] (object[], ...)]
- インスタンス変数参照 :
オブジェクト変数.プロパティ名
- メソッド呼び出し :
オブジェクト変数.メソッド名(引数,...)
- 静的メンバにアクセス
- キャスト
$x = [System.Int32] 1.3
- メンバを調べる:
$hoge | member
- 適当に書式を整理して表示:
Format-List $hoge
- 匿名メソッドなどの機能
UNIX のパイプはテキストデータのストリームだが,
PowerShellのコマンドレットは、戻り値として .NET Frameworkのオブジェクトを返す
文字列ではなくオブジェクトを渡す事に注意.
文字列型(String)として意識的に扱うなら良いが?
- 2>&1 : エラーを標準に束ねる
- $_ : パイプライン経由で渡されたオブジェクト
- ?{...} , Where-Object{...}:
引数のブロックを実行してTrueだった時だけ $_ を次のパイプラインに流す.
-match で grep 相当の動作.
.... | ?{ $_.Split(",")[3] -match "12345" } | ....
- %{ ... } , Foreach{ ... }:
引数のブロックを実行し結果を次のパイプラインに流す.
xargs 相当の動作.
...| %{ ls $_ }
$x = [System.Int32] 1.3 #
# 組み込みの型/クラス
# type System.Type
# byte System.Byte
# int System.Int32
# long System.Int64
# single, float System.Single
# double System.Double
# decimal System.Decimal
# char System.Char
# bool System.Boolean
# string System.String
# array System.Array
# xml System.Xml.XmlDocument
- @"〜"@ @'〜'@
$x=@"
a
b
c
"@
- function スコープ修飾子:関数名 [(引数[=デフォルト値],...)] { 関数の本体 ; $Args[0] ; [return 戻り値] }
# 関数を定義
$z=10
function f($x,$y){ $local:z=$Args[0] ; return $x+$y+$z }
function g($x,$y){ return $x+$y+$z }
# 呼び出し
f 1 2 3
g 1 2
- 名前なし引数は自動変数配列 $Args に格納
- 要素, 要素, 要素, ...
$x = 1,2,3
- @(要素, 要素, 要素, ...)
$x = @(1,2,3,4)
Format-List $x
Write-Output $x[0]
#配列のスライシング
$y = x[1..2]
$x=@() # empty
- @{キー名=値; キー名=値; ...}
$z = @{Alpha="kodama"; Beta=123}
Write-Output $z["Alpha"]
Write-Output $z.Alpha
$z = @{} # empty
- if( cond ){ }elseif( cond ){ }else{ }
- switch [-wildcard] (){ }
switch( val ){
cond { ;break}
default{ ;break}
}
switch -wildcard ($x){ # 正規表現によるswitch
"X*" { }
}
- パイプで選択 Where-Object , ?{}
# サイズ>1MB のファイルを探す
Get-ChildItem | ?{ $_.Length -ge 1MB -a $_.Name -match "[a-z]{1,}\.log" }
# 偶数の和
1..10 | ?{ ($_ % 2) -eq 0 } | Measure -sum ## -average -max -min など
- for( ; ; ){}
for(初期化式; 終了条件; 増分式){ }
for($i=0; $i -lt 3; $i++){ echo $i }
- foreach(){}
foreach(一時変数 in 配列,コレクション){ }
foreach($a in ls){ echo $a.name }
foreach($x in @(8,7,6)){ echo $x }
# 偶数の和
$sum = 0 ; foreach($i in 1..10) { if( ($i % 2) -eq 0) { $sum += $i } } ; echo $sum
- パイプで実行 ForEach-Object{}, foreach{} , %{} # パイプ xargs 相当
@(1,2,3) | ForEach-Object{ echo $_ }
@(1,2,3) | foreach{ echo $_ }
@(1,2,3) | %{ echo $_ } # % は foreach の alias
ls | foreach{ echo $_.name }
# 偶数の和
$sum = 0 ; 1..10 | ?{ ($_ % 2) -eq 0 } | %{ $sum += $_ } ; echo $sum
- while( cond ){ }
- do{ }while(cond)
Kodama's home / tips.