マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

PowerShell のトピックを纏めています。

特徴

オブジェクトベースのシェル

Cmd.exeを置き換えるものではない

別物として使用する必要がある。

  • 例えば、
    • ipconfig などのコマンドを実行すると、おなじみの出力が表示される。
    • netshなどのコマンドを実行して設定するぐらいはPowerShellで実行可能。
  • ただし、Cmd.exeを置き換えるものではない。
    • 標準出力をテキストとしてパイプできない。
    • BATの構文を使用できない。

環境構築

PowerShell の各バージョンは、以下のOSに添付されているか、別途ダウンロードできます。

  • 新しいOSほど、新しいPowerShellに対応します。
  • また、旧OSでは、新しいPowerShellのサポートがありません。
  • PowerShellのバージョンに依存しそうな場合は、対象とするOSが何か確認ください。

Windows PC

--Windows PC--PowerShell 1.0PowerShell 2.0PowerShell 3.0PowerShell 4.0
Windows XP SP2PS1n/an/a
Windows XP SP3PS1PS2n/an/a
Windows Vista SP1PS1PS2n/an/a
Windows Vista SP2PS1PS2n/an/a
Windows 7OS添付n/an/a
Windows 7 SP1OS添付PS3PS4
Windows 8OS添付(*1)OS添付PS4
Windows 8.1OS添付(*1)OS添付

(*1) Windows 8/8.1 の PowerShell 2.0 スクリプトは、PowerShell 4.0 の下位互換で実行できます。
PowerShell を -version 2.0 指定で実行する場合は .NET Framework 3.5 をインストールすると有効になります。

Windows Server

--Windows Server--PowerShell 1.0PowerShell 2.0PowerShell 3.0PowerShell 4.0
Windows Server 2003R2PS1n/an/a
Windows Server 2003 SP2PS1PS2n/an/a
Windows Server 2008 SP1OS添付PS2PS3n/a
Windows Server 2008 SP2OS添付PS2PS3n/a
Windows Server 2008R2 SP1OS添付PS3PS4
Windows Server 2012OS添付(*1)OS添付PS4
Windows Server 2012 R2OS添付(*1)OS添付

(*1) Windows Server 2012/2012R2 の PowerShell 2.0 スクリプトは、PowerShell 4.0 の下位互換で実行できます。
PowerShell を -version 2.0 指定で実行する場合は .NET Framework 3.5 をインストールすると有効になります。

バージョン

PS1

PS2

PS3

http://www.microsoft.com/en-us/download/details.aspx?id=34595 (現在、英語版)

PS4 Preview

http://www.microsoft.com/en-us/download/details.aspx?id=39347 (現在、英語版)

基本

実行方法

  • スタートメニューからPowerShell コマンドプロンプトを開いても、
  • コマンドプロンプトから PowerShell.exe を実行しても、

PowerShell を手で(シェルとして)逐次実行できます。

変数

定義

変数は $ で始まる 英数字記号 の名前を使用します。
後述の様に スコープ($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文

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」 を参照ください。

拡張

PSSnapin と Module

PowerShellのPS1ファイルの作成と実行

PowerShell Cmdletの作り方

PowerShell プロバイダとドライブ

情報の探し方

Get-Command

コマンドを探すには、下の様に、コマンド名の一部を*で省略して Get-Command を実行します。

Get-Command *event

get-help コマンド名

  • コマンドの説明や引数の構文を確認するには、get-help を使います。
    get-help get-childitem
  • Windows Server 2012 では、 ヘルプの文章が online から取得する様になっていることがあります。
    • 必要に応じて 「get-help コマンド -online」のようにするか、
    • 表示されたURLをブラウザで表示して構文を確認ください。

Get-Member

オブジェクトのメンバーやプロパティを確認するには、
下の様にコマンドの出力を パイプ で Get-Member に渡します。

Get-ChildItem | Get-Member

Get-WmiObject?

Get-WmiObject -List

勘所1

エラー処理

.ps1ファイルの中でエラーが発生すると、既定では、
赤文字でエラー表示されて、そのまま次の行が実行されます。
エラーを処理するには、下のいずれか必要です。

-ErrorAction? (省略形は -EA) オプション

 Trap {
   エラー処理
 }
 コマンド ....  -ErrorAction "stop"

try/catch で囲む

 $ErrorActionPreference = "stop"
 try {
   コマンド ....
 } catch [Exception] {
   エラー処理
 }

try/catch の例は、上の ps_test.ps1 を参照ください。

その他

その他の例、説明は、以下のサイトも参照ください。

デバッグ

debugは、 debug用print文、 デバッグ用環境、を使ってデバッグできます。

debug用print文

debug用print文は、 スクリプトの中に write-host コマンドを埋め込む方法です。
write-host を使用すると、 引数に指定した値が PowerShellコマンドプロンプトへ出力されます。
(write-output は、 関数の出力になるので、debug用には使わないでください。)

デバッグ用環境

デバッグ用環境 は、 PowerShell ISE (Integrated Scripting Environment) 環境が使用できます。
PowerShell ISE を使用すると、ブレークポイントの設定、ステップ実行が、メニュー操作で行えます。

debug用のコマンド

通常の 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>>>
  • Set-PsBreakpoint? を使ったデバッグ方法
    「about_Debuggers」 および下のページを参照ください。
  • 変数が変更されたときに停止するようにブレークポイントを設定することもできます。
    手順の例は、下を参照ください。

勘所2

Windows Server 2012以降の管理

Windows Server 2012以降は管理コンソールの裏はPowerShellコマンドレットになる。

  • 現行、管理コンソールはCUI → WMIで構成されている。
  • コマンドレットの裏は.NET、その裏はWMI(Windows Management Instrumentation)。
  • MS的には、今後PowerShell押し。
    • コマンドレットは<操作>-<ターゲット>の名称ルールに準拠。
    • WSHVBSとJS)は凍結される。
    • BATは今後もエンハンス有り。
    • PowerShellからBATや、WSHを実行可能。
    • また、Get-WmiObject?WMIも実行可能。
    • 難しい事をやるなら、まだWMIが必要。
  • windows management framework 3.0 RC(Win2008 sp2以降にインストール可能)
    標準化:PowerShell → WS-Management → CIMOM、SMI-S(WS-Management 以下から他のPFも管理できる)
  • Windows PowerShell Web Service(WPWS)
  • Server Manager CIM Provider

リモート、非同期ジョブ、ワークフロー

リモート

  • invoke-command マシン名やSessionを指定 -scriptblock { ・・・コード・・・ }
  • invoke-command マシン名やSessionを指定 -filepath ファイルパス

# Sessionを指定すれば処理中のジョブ等に再接続することも可能。

非同期ジョブ

  • start-job - scriptblock { ・・・コード・・・ }
  • start-job - filepath ファイルパス

# 結果はSessionの範囲でしか有効では無い。

ワークフロー

  • ファイルとして登録
  • クライアントでもサーバでも実行できる。
  • サーバが停止しても処理をレジュームできる。
    非同期ジョブと異なり、結果は永続化されている。
  • その他、並列処理等も可能。

その他

  • エイリアスを使ってUnix風にできる。
  • Windows2012からuiのアンインストール可能で、サーバコア風に運用可能。

参考

PowerShell バージョン と 動作環境

VBScriptから変換

VBScript から PowerShell へ変換のパターン

  • その他の検索
    site:microsoft.com vbscript powershell 変換

MSDN magazine

junichia

  • MS安納さん の セミナー資料、 Tech Fielders PowerShell 3.0 シリーズ(東京)
    概要から、基本的な使い方、スクリプト例、tipsまで、具体的に解説。
    以下のサイトから、セミナーの各回ごとの資料がダウンロードできます。
    http://www.microsoft.com/ja-jp/techfielders/seminar.aspx
  • 2012.06.25 [10:00-11:30]
    「開発者のための Windows PowerShell ~ 開発コストを低減する究極のライブラリ集を使い倒そう」
  • 2012.06.19 [10:00-11:30]
    「Windows PowerShell 3.0 による Windows Server 2012 管理の自動化~ワークフロー編」
  • 2012.06.12 [10:00-11:30]
    「Windows PowerShell 3.0 による Windows Server 2012 管理の自動化~リモート サーバー管理編」
  • 2012.06.04 [10:00-11:30]
    「Windows PowerShell 3.0 による Windows Server 2012 管理の自動化~初級編」

#この資料では、PowerShell 3.0 の beta/RC 版をベースにしてるため、 PowerShell 2.0 にはないコマンドも紹介されています。
#ただ、WMIオブジェクトの使い方、リモートや権限などのtipsは、PowerShell 2.0 でも参考になります。

その他

PowerShell ISE

Azure PowerShell

Azure Cloud Shell

PowerShell Core


Tags: :シェル, :インフラストラクチャ, :Windows


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-13 (火) 17:23:33 (10d)