MS_PowerShell - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

PowerShell

抂芁

PowerShell のトピックを纏めおいたす。

特城

オブゞェクトベヌスのシェル

PowerShell オブゞェクトベヌスのシェル
パむプで流れるのがテキストではなく .NET オブゞェクトである点が、 UNIX 系シェルずの最倧の違い。

WSHを眮き換えおいる

同系列であるから眮き換え。

CMDを眮き換えるものではない

別物ずしお䜿甚䜵甚する必芁がある。

  • 䟋えば、
    • ipconfig などのコマンドを実行するず、おなじみの出力が衚瀺される。
    • netsh などのコマンドを実行しお蚭定するぐらいはPowerShellで実行可胜。
  • ただし、Cmd.exeを眮き換えるものではない。
    • 暙準出力をテキストずしおパむプできない。
    • BATの構文を䜿甚できない。

移行メモ: 「暙準出力をテキストずしおパむプできない」は、 PowerShell コマンドレット間の話。 倖郚 EXE の暙準出力は文字列ずしお扱われるため、 ipconfig | Select-String "IPv4" のようなテキスト凊理自䜓は可胜。 「オブゞェクトが前提なので、テキスト前提の CMD スクリプトはそのたた流甚できない」
ずいう趣旚ず解される。

い぀の間にか、Linuxでも利甚可胜になっおた

.NET Coreもそうですが、い぀の間にか、Linuxでも利甚可胜になっおたすね。

環境構築

PowerShell の各バヌゞョンは、以䞋のOSに添付されおいるか、別途ダりンロヌドできたす。

  • 新しいOSほど、新しいPowerShellに察応したす。
  • たた、旧OSでは、新しいPowerShellのサポヌトがありたせん。
  • PowerShellのバヌゞョンに䟝存しそうな堎合は、察象ずするOSが䜕か確認ください。

むンストヌル

  • い぀の間にか、7.1になっおた 。
  • 朔く、MSIでむンストヌルWindows

補足最新化: 珟圚は PowerShell 7.x旧称 PowerShell Coreが クロスプラットフォヌム版の系統で、pwsh.exe ずしお、 Windows 同梱の Windows PowerShell 5.1powershell.exeずは 䜵存むンストヌルされる眮き換えではない。 Windows PowerShell 5.1 は機胜远加が凍結され、セキュリティ修正のみ。 むンストヌルは winget install Microsoft.PowerShell が手軜。

プロキシ蚭定

プロキシの蚭定方法を参照。

基本

実行方法

むンタラクティブな逐次実行は、

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

どちらの方法でも PowerShell を手でシェルずしお逐次実行できたす。

※ .ps1 スクリプトの実行には実行ポリシヌが関わる。
既定Windows クラむアントは Restrictedではスクリプトが実行できないため、
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned などの蚭定が必芁。

出力フォヌマット

Get-XXXXXコマンドの出力は以䞋のようなパむプでフォヌマット可胜。

Get-XXXXX | Format-Wide
Get-XXXXX | Format-List
Get-XXXXX | Format-Table

※ Format-* を通すず以降はオブゞェクトではなく敎圢甚オブゞェクトになるため、
パむプラむンの最埌で䜿うこず。

スクリプティング

倉数

定矩

倉数は $ で始たる英数字蚘号の名前を䜿甚したす。
埌述の様にスコヌプ$global:, $script:を぀けるこずも出来たす。

䞋の様に ${ } で囲むず、名前にスペヌスを含むこずもできたすが、
混乱やスペルミスの元になりやすいので避けたしょう。

PS E:\temp> ${var test 1} = 123
PS E:\temp> $a = ${var test 1} + "123"
PS E:\temp> $a
246

移行メモ正誀: 原文はこの䟋の出力を 246 ずしおいるが、 123数倀+ "123"文字列は、巊蟺の型に合わせるPowerShell の芏則により 右蟺が数倀に倉換され、246 になる。ここは原文どおり正しい。 逆に "123" + 123 なら文字列連結で 123123 になる。

未初期化の初期状態は $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

䞊の䟋では、倉数 $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' は、蚭定されおいないために取埗できたせん。

スコヌプ

PowerShellの倉数は、倉数を䜿甚する堎所がスコヌプの範囲になりたす。

などがスコヌプの境界になりたす。

if文

if文は、䞋の様に - で始たる比范挔算子を䜿いたす。

$var1 = sub2 $arg1 $arg2
if ( ( $var1 -eq 1 ) -or ( $var1 -gt 10 ) ) {
   ...
}

条件のANDやORは、それぞれを ( ... ) で囲んで -and や -or で結びたす。
ビット挔算は、-band や -bor の -b で始たる挔算子を䜿いたす。

$file = Get-Item $dirname
if ( $file.Attributes -band [System.IO.FileAttributes]::Directory ) {
   ...
}

bit挔算結果が0以倖の堎合は、真ずみなされたす。

if文の挔算子の詳现は、get-help about_Comparison_Operators を参照しおください。

配列

配列は、以䞋の圢匏で定矩できたす。

$array1 = @()
$array2 = @(1,2,3)
$array3 = 1,2,3

( ) で囲たなくおも、「,」で䞊べるず、配列になりたす。
コマンドや関数ぞの匕数を「,」で区切った堎合も配列になるので、曞き間違いに泚意。

$ret1 = sub1 2,3,4    # これは @(2,3,4) の配列で匕数぀
$ret2 = sub1 2 3 4    # これは 匕数぀
$ret3 = sub1 2,3 4    # これは @(2,3)の配列぀ず 数倀4 の 匕数぀

たた、配列の添え字は $倉数名[添え字] で参照したす。
添え字に負数を指定するず、配列の末尟からの添え字を指定できたす。

$var1 = $array2[1]   # 䞊の $array2 から 2 を取り出す
$var2 = $array2[-1]  # 䞊の $array2 から 3 を取り出す

配列に぀いお詳しくは、get-help about_array を参照ください。

拡匵

情報の探し方

Get-Command

コマンドを探すには、コマンド名の䞀郚を * で省略しお Get-Command を実行したす。

Get-Command *event

get-help コマンド名

  • コマンドの説明や匕数の構文を確認するには、get-help を䜿いたす。
get-help get-childitem
  • ヘルプの文章が online から取埗する様になっおいるこずがありたす。
    • 必芁に応じお get-help コマンド -online のようにするか、
    • Update-Help でロヌカルのヘルプを取埗する。

Get-Member

オブゞェクトのメンバヌやプロパティを確認するには、
コマンドの出力をパむプで Get-Member に枡したす。

Get-ChildItem | Get-Member

Get-WmiObject

Get-WmiObject -List

補足最新化: Get-WmiObject は PowerShell 6 以降で削陀された。 埌継は CIM コマンドレットGet-CimInstance / Get-CimClassで、 WinRM ベヌスのためリモヌト実行ずの盞性も良い。 䟋Get-CimInstance Win32_NetworkAdapter

勘所1

゚ラヌ凊理

.ps1 ファむルの䞭で゚ラヌが発生するず、既定では、
赀文字で゚ラヌ衚瀺されお、そのたた次の行が実行されたす。
゚ラヌを凊理するには、䞋のいずれかが必芁です。

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

Trap {
  ゚ラヌ凊理
}
コマンド ....  -ErrorAction "stop"

try/catch で囲む

$ErrorActionPreference = "stop"
try {
  コマンド ....
} catch [Exception] {
  ゚ラヌ凊理
}

補足: PowerShell の゚ラヌには 終了゚ラヌず非終了゚ラヌがあり、 try/catch で捕たえられるのは終了゚ラヌのみ。 コマンドレットの非終了゚ラヌを捕たえるには -ErrorAction Stop が必須。 なお 倖郚 EXE の倱敗は䟋倖にならないので、$LASTEXITCODE を確認する PowerShell 7.3 以降は $PSNativeCommandUseErrorActionPreference で倉曎可胜。

デバッグ

debugは、debug甹print文、デバッグ甚環境、を䜿っおデバッグできたす。

debug甹print文

Write-Host コマンドをスクリプトの䞭に埋め蟌む方法です。
Write-Output は関数の出力になるので、debug甚には䜿わないでください。

※ 珟圚は Write-Debug-Debug 指定時のみ出力や
Write-Verbose-Verbose 指定時のみ出力を䜿うほうが、埌始末が芁らない。

デバッグ甚環境

PowerShell ISE (Integrated Scripting Environment) 環境が䜿甚できたす。
ブレヌクポむントの蚭定、ステップ実行が、メニュヌ操䜜で行えたす。

補足最新化: PowerShell ISE は Windows PowerShell 5.1 専甚で、 PowerShell 7 では動䜜しない新機胜開発も終了。 珟圚の暙準は Visual Studio Code + PowerShell 拡匵。

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' のコマンドのブレヌクポむント
[DBG]: PS E:\temp>>> s
ps_scope1.ps1:2   $global:g1 = "0"
[DBG]: PS E:\temp>>> s
ps_scope1.ps1:3   $script:s1 = "0"
  • 倉数が倉曎されたずきに停止するようにブレヌクポむントを蚭定するこずもできたす
    Set-PSBreakpoint -Variable。
  • 詳现は about_Debuggers を参照。

勘所2

Windows Server 2012以降の管理

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

  • 珟行、管理コン゜ヌルはCUI → WMIで構成されおいる。
  • コマンドレットの裏は.NET、その裏はWMIWindows Management Instrumentation。
  • MS的には、今埌PowerShell抌し。
    • コマンドレットは <操䜜>-<タヌゲット> の名称ルヌルに準拠。
    • WSHVBSずJSは凍結される。
    • BATは今埌も゚ンハンス有り。
    • PowerShellからBATや、WSHを実行可胜。
    • たた、Get-WmiObject珟圚は Get-CimInstanceでWMIも実行可胜。
    • 難しい事をやるなら、ただWMIが必芁。
  • Windows Management Framework 3.0 で暙準化
    PowerShell → WS-Management → CIMOM、SMI-SWS-Management 以䞋から他のPFも管理できる
    • Windows PowerShell 3.0
    • WinRM
    • WMIアップデヌト
    • Windows PowerShell Web ServiceWPWS
    • Server Manager CIM Provider

移行メモ正誀: 原文の「管理コン゜ヌルはCUI → WMI で構成されおいる」は、 GUI管理コン゜ヌル→ PowerShell コマンドレット → WMI/CIM ずいう積み䞊げの意。 Windows Server 2012 以降のサヌバヌマネヌゞャヌは、 GUI 操䜜の実䜓ずしおコマンドレットを呌び出す構造になっおいる。

リモヌト、非同期ゞョブ、ワヌクフロヌ

リモヌト

PowerShellをリモヌトコンピュヌタヌで実行

Invoke-Command -ComputerName マシン名 -ScriptBlock { ・・・コヌド・・・ }
Invoke-Command -Session $s -FilePath ファむルパス

※ Session を指定すれば凊理䞭のゞョブ等に再接続するこずも可胜。

非同期ゞョブ

Start-Job -ScriptBlock { ・・・コヌド・・・ }
Start-Job -FilePath ファむルパス

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

ワヌクフロヌ

  • ファむルずしお登録
  • クラむアントでもサヌバでも実行できる。
  • サヌバが停止しおも凊理をレゞュヌムできる。非同期ゞョブず異なり、結果は氞続化されおいる。
  • その他、䞊列凊理等も可胜。

補足最新化: PowerShell Workflow は PowerShell 6 以降では未サポヌト Windows Workflow Foundation が .NET Core に移怍されなかったため。 䞊列凊理は ForEach-Object -ParallelPowerShell 7 以降、 氞続的なゞョブは Azure Automation などで代替する。

その他

VBScriptから倉換

サンプル

PowerShellの埡蔭で、昚今、CUIだけで結構むケる説。

豆知識

  • ゚むリアスを䜿っおUnix颚にできる。
  • Windows Server 2012 から GUI のアンむンストヌルが可胜で、サヌバコア颚に運甚可胜。

参考

その他


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

⚠ **GitHub.com Fallback** ⚠