「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
PowerShell のトピックを纏めています。
同系列であるから置き換え。
別物として使用(併用)する必要がある。
.NET Coreもそうですが、いつの間にか、Linuxでも利用可能になってますね。
PowerShell の各バージョンは、以下のOSに添付されているか、別途ダウンロードできます。
インタラクティブな逐次実行は、
どちらの方法でも PowerShell を手で(シェルとして)逐次実行できます。
Get-XXXXXコマンドの出力配下のようなパイプでフォーマット可能。
Get-XXXXX | Format-Wide
Get-XXXXX | Format-List
Get-XXXXX | Format-Table
変数は $ で始まる 英数字記号 の名前を使用します。
後述の様に スコープ($global:, $script:) をつけることも出来ます。
下の様に ${ } で囲むと、名前にスペースを含むこともできますが、混乱やスペルミスの元になりやすいので避けましょう。
PS E:\temp> ${var test 1} = 123 PS E:\temp> $a = ${var test 1} + "123" PS E:\temp> $a 246 PS E:\temp>
未初期化の初期状態は $null と同じです。
文脈によっては 0 や "" (空文字列) と解釈されます。
PS E:\temp> $var001 PS E:\temp> $var001 -eq 0 False PS E:\temp> $var001 -eq $null True PS E:\temp> $a1 = $var001 + 2 PS E:\temp> $a1 2 PS E:\temp> $a1 = $var001 + "abc" PS E:\temp> $a1 abc PS E:\temp>
上の例では、変数 $var001 は未初期化なので、 $null と同じです。
変数をそのまま出力すると、$null は 何も表示されません。
また、 -eq 比較演算子を使って、 0 や $null と比較すると、$null であることが判断できます。
未初期化変数は、数値を足し算した場合は、0 が、文字列を連結した場合は、"" が、それぞれ仮定されます。
Set-StrictMode? を使用すると、未初期化変数を参照する際にエラーとして検出できます。
PS E:\temp> Set-StrictMode -Version 1.0 PS E:\temp> $a1 = $var001 + 2 変数 '$var001' は、設定されていないために取得できません。 発生場所 行:1 文字:14 + $a1 = $var001 <<<< + 2 + CategoryInfo : InvalidOperation: (var001:Token) []、RuntimeExcep tion + FullyQualifiedErrorId : VariableIsUndefined PS E:\temp>
PowerShellの変数は、変数を使用する場所がスコープの範囲になります。
などがスコープの境界になります。
if文は、下の様に -で始まる比較演算子を使います。
$var1 = sub2 $arg1 $arg2 if ( ( $var1 -eq 1 ) -or ( $var1 -gt 10 ) ) { ... }
条件のANDやORは、 それぞれを ( ... )で囲んで -and や -or で結びます。
論理のANDやORによるビット演算は、 -band や -bor の -b で始まる演算子を使います。
$file = get-item $dirname if ( $file.Attributes -band [System.IO.FileAttributes]::Directory ) { ... }
bit演算結果が0以外の場合は、真 とみなされます。
if文の演算子の詳細は、powershellコマンドプロンプトの中で 「get-help about_Comparison_Operators」を参照してください。
配列は、以下の形式で定義できます。
$array1 = @() $array2 = @(1,2,3) $array3 = 1,2,3
( ) で囲まなくても、「,」で並べると、配列になります。
コマンドや関数への引数を「,」で区切った場合も配列になるので、書き間違いに注意。
$ret1 = sub1 2,3,4 # これは @(2,3,4) の配列で引数1つ $ret2 = sub1 2 3 4 # これは 引数3つ $ret3 = sub1 2,3 4 # これは @(2,3)の配列1つと 数値4 の 引数2つ
また、配列の添え字は、$変数名[添え字] で参照します。
添え字に 負数 を指定すると、配列の末尾からの添え字を指定できます。
$var1 = $array2[1] # 上の $array2 から 2 を取り出す $var2 = $array2[-1] # 上の $array2 から 3 を取り出す
配列について詳しくは、 PowerShellコマンドプロンプトで「get-help about_array」 を参照ください。
コマンドを探すには、下の様に、コマンド名の一部を*で省略して Get-Command を実行します。
Get-Command *event
get-help get-childitem
オブジェクトのメンバーやプロパティを確認するには、
下の様にコマンドの出力を パイプ で Get-Member に渡します。
Get-ChildItem | Get-Member
Get-WmiObject -List
.ps1ファイルの中でエラーが発生すると、既定では、
赤文字でエラー表示されて、そのまま次の行が実行されます。
エラーを処理するには、下のいずれか必要です。
Trap { エラー処理 } コマンド .... -ErrorAction "stop"
$ErrorActionPreference = "stop" try { コマンド .... } catch [Exception] { エラー処理 }
try/catch の例は、上の ps_test.ps1 を参照ください。
その他の例、説明は、以下のサイトも参照ください。
debugは、 debug用print文、 デバッグ用環境、を使ってデバッグできます。
debug用print文は、 スクリプトの中に write-host コマンドを埋め込む方法です。
write-host を使用すると、 引数に指定した値が PowerShellコマンドプロンプトへ出力されます。
(write-output は、 関数の出力になるので、debug用には使わないでください。)
デバッグ用環境 は、 PowerShell ISE (Integrated Scripting Environment) 環境が使用できます。
PowerShell ISE を使用すると、ブレークポイントの設定、ステップ実行が、メニュー操作で行えます。
通常の PowerShellコマンドプロンプトのままでも、
Set-PsBreakpoint? 等の debug用のコマンドを使用して、1行ずつステップ実行することも出来ます。
PS E:\temp> Set-PsBreakpoint -command .\ps_scope1.ps1 ID Script Line Command Variable Action -- ------ ---- ------- -------- ------ 0 .\ps_scope1.ps1 PS E:\temp> .\ps_scope1.ps1 デバッグ モードを開始します。ヘルプを表示するには、h または ? を使用してください。 ヒット '.\ps_scope1.ps1' のコマンドのブレークポイント .\ps_scope1.ps1 [DBG]: PS E:\temp>>> s ps_scope1.ps1:2 $global:g1 = "0" [DBG]: PS E:\temp>>> s ps_scope1.ps1:3 $script:s1 = "0" [DBG]: PS E:\temp>>> s ps_scope1.ps1:4 $v1 = "0" [DBG]: PS E:\temp>>> s ps_scope1.ps1:6 write-host "before : g1=$global:g1 s1=$script:s1 v1=$v1 v2=$v2" [DBG]: PS E:\temp>>> s before : g1=0 s1=0 v1=0 v2= ps_scope1.ps1:8 function test1 { [DBG]: PS E:\temp>>> s ps_scope1.ps1:17 test1 [DBG]: PS E:\temp>>> s ps_scope1.ps1:9 write-host "start test1 : g1=$global:g1 s1=$script:s1 v1=$v1 v2=$v2" [DBG]: PS E:\temp>>>
Windows Server 2012以降は管理コンソールの裏はPowerShellコマンドレットになる。
# Sessionを指定すれば処理中のジョブ等に再接続することも可能。
# 結果はSessionの範囲でしか有効では無い。
Updated: June 24, 2013
Applies To: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0
VBScript から PowerShell へ変換のパターン
PowerShellの御蔭で、昨今、CUIだけで結構イケる説。
#この資料では、PowerShell 3.0 の beta/RC 版をベースにしてるため、 PowerShell 2.0 にはないコマンドも紹介されています。
#ただ、WMIオブジェクトの使い方、リモートや権限などのtipsは、PowerShell 2.0 でも参考になります。
Tags: :シェル, :インフラストラクチャ, :Windows, :Linux