Kodama's home / tips.

PowerShell 関連の文法事項

  1. スクリプトファイル
  2. 実行ポリシーを設定
  3. 変数
  4. オブジェクト指向
  5. パイプ処理
  6. 型キャスト
  7. ヒアドキュメント
  8. 関数
  9. 配列
  10. ハッシュテーブル/連想配列
  11. 条件分岐
  12. 繰り返し

PowerShell 関連の文法事項

PowerShell スクリプトの文法事項を中心としたメモ.

スクリプトファイル

拡張子 .ps2 でスクリプトファイルを作成する.
  1. # コメント
  2. コマンド名の大文字/小文字の別は無視される.
  3. 文字コードは Unicode/UTF8
  4. 改行コードは windows形式 (CRLF)

実行ポリシーを設定

デフォルトでは安全のためスクリプトファイルは実行禁止になっている. スクリプトを実行する前に実行ポリシーを設定する.
コマンドラインで設定の例.
  Set-ExecutionPolicy Unrestricted
  #Unrestricted, RemoteSigned

スクリプト実行時に指定の例.
PowerShell -ExecutionPolicy Unrestricted -File sample-script.ps1

変数

  1. 変数名 $[a-zA-Z0-9_]*
  2. 自動変数 $Args
     $Args[0] 
  3. $スコープ修飾子:変数名 で変数のスコープを指定することができる (global、script、local)
    	  $global:x
    	  $script:y
    	  $local:z
    	

オブジェクト指向

コマンドの結果, 変数の値などはすべてオブジェクト.
  1. Import-Module モジュール/クラスライブラリの読み込み. 使用前に追加で読み込みが必要なクラスもある.
     Import-Module ActiveDirectory
  2. GetType() 型を得る:
      $hoge.gettype()
  3. 生成
     
    	$x = New-Object クラスの完全修飾名(引数,...)
    	$x = New-Object [-typeName] クラスの完全修飾名 [[-argumentList] (object[], ...)]
      
  4. インスタンス変数参照 :
    オブジェクト変数.プロパティ名
  5. メソッド呼び出し :
     オブジェクト変数.メソッド名(引数,...) 
  6. 静的メンバにアクセス
  7. キャスト
     $x = [System.Int32] 1.3 
  8. メンバを調べる:
     $hoge | member 
  9. 適当に書式を整理して表示:
     Format-List $hoge
  10. 匿名メソッドなどの機能

パイプ処理

UNIX のパイプはテキストデータのストリームだが, PowerShellのコマンドレットは、戻り値として .NET Frameworkのオブジェクトを返す 文字列ではなくオブジェクトを渡す事に注意. 文字列型(String)として意識的に扱うなら良いが?
  1. 2>&1 : エラーを標準に束ねる
  2. $_ : パイプライン経由で渡されたオブジェクト
  3. ?{...} , Where-Object{...}:
    引数のブロックを実行してTrueだった時だけ $_ を次のパイプラインに流す. -match で grep 相当の動作.
     .... | ?{ $_.Split(",")[3] -match "12345" } | .... 
  4. %{ ... } , 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

ヒアドキュメント

  1. @"〜"@ @'〜'@
    $x=@"
    a
    b
    c
    "@
    

関数

  1. 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
    	
  2. 名前なし引数は自動変数配列 $Args に格納

配列

  1. 要素, 要素, 要素, ...
     $x = 1,2,3 
  2. @(要素, 要素, 要素, ...)
     
    	  $x = @(1,2,3,4)
    	  Format-List $x
    	  Write-Output $x[0]
    
    	  #配列のスライシング
    	  $y = x[1..2]
    
    	  $x=@() # empty
    	

ハッシュテーブル/連想配列

  1. @{キー名=値; キー名=値; ...}
    	  $z = @{Alpha="kodama"; Beta=123}
    	  Write-Output $z["Alpha"]
    	  Write-Output $z.Alpha
    	  $z = @{} # empty
    	

条件分岐

  1. if( cond ){ }elseif( cond ){ }else{ }
  2. switch [-wildcard] (){ }
    	  switch( val ){
          cond  {   ;break}
          default{  ;break}
    	  }
    	
    	  switch -wildcard ($x){ # 正規表現によるswitch
          "X*"  {  }
    	  }
    	
  3. パイプで選択 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 など
    	

繰り返し

  1. for( ; ; ){}
    	  for(初期化式; 終了条件; 増分式){  }
          for($i=0; $i -lt 3; $i++){ echo $i }
    	
  2. 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
    	
  3. パイプで実行 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
    	 
    	
  4. while( cond ){ }
  5. do{ }while(cond)

Kodama's home / tips.