HOME > PowerShell > Tips > 基本的な事

基本的な事


作成日 2017年09月13日
更新日 2018年08月03日
  1. コメント(#以降か、あるいは<#から、#>まで)
  2. 「管理者として実行」するように要求する(#Requires)
  3. 特殊文字(about_Special_Characters)
  4. 複数行の文字列を宣言する(ヒア文字列)
  5. 記号、全角を含む変数名を使用する
  6. グローバル変数に値を設定する($Global:)
  7. スクリプトの関数を読み込む(ドット ソース形式で読み込む)
  8. 連想配列を整列して表示する(GetEnumerator)
  9. ヘルプを表示する(Get-Help)
  10. コマンドレットの一覧を表示する(Get-Command)
  11. コマンドレットのパラメーターをダイアログで入力する(Show-Command)
  12. 定数を宣言する(ReadOnly)
  13. コンソールに出力する(Write-Host)
  14. コンソールから入力する(Read-Host)
  15. 実行したスクリプトのファイル名を取得する($PSCommandPath)
  16. コマンドレットのパラメーターの省略値を設定する($PSDefaultParameterValues)
  17. オブジェクトのデータ型を表示する(GetType)
  18. プロパティとメソッドを表示する(Get-Member)
  19. コマンドの履歴の取得、実行、保存と追加(Get-History、Invoke-History、Add-History)
  20. ユーザー設定変数、自動変数

コメント(#以降か、あるいは<#から、#>まで)

行のシャープ記号(#)以降はコメントで、実行されません。
<#から、#>まではコメントです。複数の行をコメントにできます。
Get-Help -Category HelpFile about_Comment_Based_Help # シャープ記号以降はコメントです。

<#
複数の行を
コメントにします。
#>
注意 スクリプトの行に含まれる最初の項目が、#Requiresはコメントではありません。「管理者として実行」するように要求する(#Requires)を参照してください。
   関数とスクリプトのコメントベースのヘルプ トピックの場合もあります。「コメントベースのヘルプの作成」を参照してください。

このページの上

「管理者として実行」するように要求する(#Requires)

管理者として実行するように要求するには、ファイルの最初の項目を、#Requires -RunAsAdministrator で始めます。
Requiresのパラメーターは他にも -PSSnapin、-Modules、-ShellId、-Versionがあります。
複数の#Requiresを指定できます。下記は管理者として実行し、かつ5.1以上のバージョンを要求します。
#Requires -RunAsAdministrator
#Requires -Version 5.1
【外部リンク】マイクロソフトのabout_Requires

このページの上

特殊文字(about_Special_Characters)

記号の前にバッククォート記号の(`)を使用します。
記号説明
`0Null
`a警告音(Windows PowerShell ISEでは鳴りません。[Console]::Beep()を使用してください)
`bバックスペース
`fフォームフィールド
`n改行。 Windowsでは2文字の`r`nです。OSに影響しない場合は[System.Environment]::NewLine
`r復帰
`tタブ
`v垂直タブ
`'一重引用符
`"二重引用符
``バッククォート
行の継続にバッククォート記号の(`)を、文の区切りにセミコロン(;)を使用します。
コマンドラインの --% 以降は解析しません。
PS > Cmd.exe --% /c Echo ({#$%@})
({#$%@})

スペースを含むファイルを実行する場合は、引用符で囲みアンパーサンド記号(&)を先頭に付けます。(&は呼び出し演算子)
&"C:\Program Files\Internet Explorer\IExplore.exe"
あるいはスペースの前にバッククォートを付けます。
C:\Program` Files\Internet` Explorer\IExplore.exe

ダラー記号($)は変数の名前の先頭の文字に使用します。ファイル名に「$」を含む場合は一重引用符(')で囲みます。
PS C:\bin\PowerShell\Sample> Get-ChildItem *.$$$

PS C:\bin\PowerShell\Sample> Get-ChildItem '*.$$$'

    ディレクトリ: C:\bin\PowerShell\Sample

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----           18/4/1     21:45              4 test.$$$
あるいは「$」の前に「`」を挿入します。
Get-ChildItem  *.`$`$`$


このページの上

複数行の文字列を宣言する(ヒア文字列)

@"と"@で行を囲みます。あるいは@'と'@で行を囲みます。
二重引用符で囲む場合は変数を展開しますが、一重引用符は展開しません。
$S1=@"
ヒア文字列は複数の行の文字列を宣言できます。
二重引用符で囲む場合は変数を展開します。
システムディレクトリ:$Env:SystemRoot
`` バッククォート
`$ ドル記号
`' 一重引用符
`" 二重引用符
改行`n
"@
Write-Host $S1

$S2=@'
ヒア文字列内のシャープ記号の(#)はコメントではありません。
一重引用符で囲む場合は変数を展開しません。
システムディレクトリ:$Env:SystemRoot
'@
Write-Host $S2
上記のスクリプトを実行すると、下記を表示します。
ヒア文字列は複数の行の文字列を宣言できます。
二重引用符で囲む場合は変数を展開します。
システムディレクトリ:C:\WINDOWS
` バッククォート
$ ドル記号
' 一重引用符
" 二重引用符
改行

ヒア文字列内のシャープ記号の(#)はコメントではありません。
一重引用符で囲む場合は変数を展開しません。
システムディレクトリ:$Env:SystemRoot

二重引用符の中で配列の項目を表示する場合は、 $( と ) で囲みます。
PS > $arr = @("Left", "Center", "Right")
PS > "`$arr[0] = $($arr[0])"
$arr[0] = Left

このページの上

記号、全角を含む変数名を使用する

変数の名前はダラー記号($)で始まる下線(_)か英数字です。(英字の大文字と小文字は区別しません)
変数名に下線以外の記号か、あるいは全角を含む場合は、 ${ と } で囲みます。
PS > ${商品名#-%}="Apple"
PS > ${商品名#-%}
Apple

このページの上

グローバル変数に値を設定する($Global:)

グローバル変数はスクリプトブロック内を除くプロンプトラインプロファイル、ドットスペースによるスクリプトファイルの読み込む場合などです。
子のスクリプトブロックからグローバル変数の値を設定するには、変数の名前の前に「Global:」を付けます。 例.$Global:Max_Count、${Global:商品名}
値を取得するだけなら「Global:」は必要ありません。グローバル変数の名前は重複しないように長い名前にしたり接頭語を付けましょう。
PS > $G_MaxGroup=7
PS > &{ $G_MaxGroup } # 値を取得するだけなら「Global:」は必要ありません。
7
PS > &{ $Global:G_MaxGroup=8 }
PS > $G_MaxGroup
8
他にScript:は同一のスクリプトファイル、Private:は現在のスコープのみ(子のスクリプトブロックも不可)、Using:はリモートコマンド内の変数をローカルセッションで作成したとします。

下記は子のスクリプトブロックから変数の名前にScript:を付けることによって、同一のスクリプトファイル内の変数の$UserNameの値を設定できます。
$UserName=""
&{ $Script:UserName="Tanaka" }
"Hello $UserName !"
【注意】Windows PowerShell ISEで「デバッグ」の「実行」メニューを実行すると、ドットスペースによるスクリプトファイルを読み込むのと同じでグローバルなスコープになります。

このページの上

スクリプトの関数を読み込む(ドット ソース形式で読み込む)

スクリプト ファイルの関数を読み込み、コマンドラインから実行できるようにします。
ファイルのスクリプト ブロックの中以外の変数(Private:を含む)は、グローバル(Global:)スコープになります。
半角のピリオドとスペースを入力してから、スクリプトのファイルのパスを入力します。
下記を実行するとカレント ディレクトリにある「a.ps1」ファイル内の関数を使用できます。
. .\a.ps1
Windows PowerShell iSEの「デバッグ」の「実行/続行」メニューで、スクリプト ブロックの中以外は「Private:」を付けててもグローバルになります。

このページの上

連想配列を整列して表示する(GetEnumerator)

PS > $arr=@{c=2; b=3; a=1}
PS > $arr

Name                           Value
----                           -----
c                              2
a                              1
b                              3

キーを昇順に並べて表示します。
PS > $arr.GetEnumerator() | Sort-Object -Property Key

Name                           Value                          
----                           -----                          
a                              1                              
b                              3                              
c                              2                              

値を降順に並べて表示します。
PS > $arr.GetEnumerator() | Sort-Object -Property Value -Descending

Name                           Value                         
----                           -----                          
b                              3                              
c                              2                              
a                              1

このページの上

ヘルプを表示する(Get-Help)

Get-Helpコマンドレットは、ヘルプを表示します。バージョンによりヘルプがありません。ヘルプのアップデート(Update-Help)してください。
-Fullパラメーターは、すべての項目のヘルプを表示します。
-Onlineパラメーターは、オンラインのヘルプを表示します。
-ShowWindowパラメーターは、新たに別のウィンドウを開きヘルプを表示します。
下記はGet-ChildItemコマンドレットのすべての項目のヘルプを表示します。
Get-Help Get-ChildItem -Full

下記はヘルプ トピックスのabout_で始まるファイルの一覧を表示します。
Get-Help -Category HelpFile

下記はSwitch文の詳細な説明を表示します。
Get-Help about_Switch 

下記は新たに別のウィンドウを開き、Set-ItemPropertyコマンドレットのヘルプを表示します。(PowerShellのVersion 6.0.2はエラー)
Get-Help Set-ItemProperty -ShowWindow

Windows PowerShellでHelp関数は、ページ単位でヘルプを表示します。(コマンド プロンプト用のMore.comを使うので、Windows PowerShell ISEはページ単位で表示できません)
下記はGet-ChildItemコマンドレットのページ単位でヘルプを表示します。
Help Get-ChildItem
スペースキーで、次のページを表示します。
ENTERキーで、1行を送り表示します。
Qキーで、表示を途中で終了します。

このページの上

コマンドレットの一覧を表示する(Get-Command)

Get-Commandコマンドレットで一覧を表示します。
パラメーターの-Verbで動詞、-Nounで名詞、-CommandTypeでコマンドタイプを抽出します。
-CommandTypeはAlias、All、Application、Cmdlet、Configuration、ExternalScript、Filter、Function、Script、Workflowがあります。
Get-Command
Get-Command -Verb Measure
Get-Command -Noun Alias
Get-Command -CommandType Function

このページの上

コマンドレットのパラメーターをダイアログで入力する(Show-Command)

下記はNew-ModuleManifestコマンドレットのパラメーターを入力するダイアログを表示します。
Show-Command New-ModuleManifest
パラメーターが多い場合は便利です。PowerShell ISEは「表示」の「コマンド アドオンを表示」メニューにチェックを入れると表示されます。
Show-Commandのダイアログ

このページの上

定数を宣言する(ReadOnly)

下記は「pi」の名前で、値が「3.14」の定数を宣言します。(円周率は [System.Math]::PI を使用してください)
New-Variable -Name pi -Value 3.14 -Option ReadOnly

削除する場合はパラメーターの-Forceを付けます。
Remove-Variable -Name pi -Force

Constantで作成した場合は終了するまで削除できません。
New-Variable -Name pi -Value 3.14 -Option Constant

このページの上

コンソールに出力する(Write-Host)

Write-Hostコマンドレットでコンソールに出力します。
Write-Outputコマンドレットとは違いリダイレクトしません。また関数の戻り値にはなりません。
下記は「Error」の文字列を前景色は赤、背景色は黒でコンソールに表示します。
PS > Write-Host "Error" -ForegroundColor Red -BackgroundColor Black
Error

-NoNewlineパラメーターを指定すると改行しません。
PS > for ($i=1; $i -le 9; $i++) { Write-Host ($i.ToString()+"`t") -NoNewline }
1	2	3	4	5	6	7	8	9

パラメーターを ( と ) の小括弧で囲むと式モードになり計算してから表示します。
PS > Write-Host 1 + 2
1 + 2

PS > Write-Host (1 + 2)
3
Write-Outputコマンドレットのようにスペースで改行しません。
PS > Write-Output 1 + 2
1
+
2

-Separatorパラメーターで区切り記号を指定します。
PS > Write-Host @(Get-ChildItem -Path .\a*.txt -File) -Separator " | "
C:\bin\PowerShell\Sample\a.txt | C:\bin\PowerShell\Sample\alias.txt | C:\bin\PowerShell\Sample\Assemblies.txt


このページの上

コンソールから入力する(Read-Host)

Read-Hostコマンドレットでコンソールから入力できます。
-Promptパラメーターで入力のメッセージを表示します。表示する文字列の最後にコロン「:」が自動で付きます。
下記は入力した文字列の文字数を表示します。
PS > $Buf = Read-Host -Prompt "文字列を入力してください"
文字列を入力してください: あいうえお

PS > $Buf.Length
5

下記は、-AsSecureStringパラメーターで入力した文字を隠し、System.Security.SecureString型で取得します。
PS > $Pass = Read-Host "パスワード" -AsSecureString
パスワード: **********

このページの上

実行したスクリプトのファイル名を取得する($PSCommandPath)

変数の「$PSCommandPath」はフルパス名、「$MyInvocation.MyCommand.Name」はファイル名です。
「$PSScriptRoot」はスクリプトファイルあるフォルダ名です。
$PSCommandPath
Split-Path -Path $PSCommandPath -Leaf
$MyInvocation.MyCommand.Name
$PSScriptRoot
Split-Path $PSCommandPath -Parent
上記のソースのファイルの「C:\bin\PowerShell\Sample\a.ps1」を実行しました。
C:\bin\PowerShell\Sample\a.ps1
a.ps1
a.ps1
C:\bin\PowerShell\Sample
C:\bin\PowerShell\Sample

このページの上

コマンドレットのパラメーターの省略値を設定する($PSDefaultParameterValues)

コマンドレットのパラメーターの省略値を設定します。起動時に変更するにはプロファイルで設定してください。
連想配列の「$PSDefaultParameterValues」に下記の形式で設定します。複数ある場合はセミコロン(;)で区切ります。
$PSDefaultParameterValues = @{"コマンドレット名:パラメーター名"=値あるいはスクリプトブロック; "コマンドレット名:パラメーター名"=値あるいはスクリプトブロック}
下記はGet-HELPコマンドレットのパラメーターをFullに、Get-ChildItemコマンドレットのパラメーターをForceに設定します。
$PSDefaultParameterValues = @{"Get-HELP:Full"=$True; "Get-ChildItem:Force"=$True}

下記はデフォルトを一時的に無効にします。
$PSDefaultParameterValues["Disabled"]=$true
有効に戻すには、$PSDefaultParameterValues["Disabled"]=$false を実行します。

このページの上

オブジェクトのデータ型を表示する(GetType)

下記はファイル「.\a.txt」の型の「System.IO.FileInfo」を表示します。
(Get-ChildItem -LiteralPath .\a.txt).GetType().FullName

このページの上

プロパティとメソッドを表示する(Get-Member)

下記はファイル「.\a.txt」の型の「System.IO.FileInfo」のプロパティとメソッドを表示します。
Get-ChildItem -LiteralPath .\a.txt | Get-Member

このページの上

コマンドの履歴の取得、実行、保存と追加(Get-History、Invoke-History、Add-History)

Get-Historyコマンドレットは、コマンドの履歴を表示します。
Get-History

下記はコマンドの履歴をファイルに保存します。
Get-History | Export-Csv History.csv

下記はコマンドの履歴をファイルから読み込み追加します。
Import-Csv .\History.csv | Add-History

Invoke-Historyコマンドレットは、コマンドの履歴を番号で実行します。
下記は5番目の履歴のコマンドを実行します。
Invoke-History -Id 5

Clear-Historyコマンドレットは、コマンドの履歴のすべてをクリアーします。
Clear-History

このページの上

ユーザー設定変数、自動変数

現在使用している変数の一覧は、Get-Variableコマンドレットで表示します。
Get-Variable

環境変数はGet-ChildItemコマンドレットで「Env:」ドライブを指定して表示します。
Get-ChildItem Env:

【外部リンク】ユーザー設定変数はマイクロソフトの「about_Preference_Variables」を参照してください。
【外部リンク】自動変数はマイクロソフトの「about_Automatic_Variables」を参照してください。
【外部リンク】環境変数はマイクロソフトの「about_Environment_Variables」を参照してください。
$$最後のコマンドラインの最後のトークンです。(コマンドレットとして使う場合は、&$$)
$?最後のコマンドの状態です。正常は$true、エラーは$falseです。
$^最後のコマンドラインの最初のトークンです。(コマンドレットとして使う場合は、&$^)
$_$PSItemと同じで、パイプラインのオブジェクトです。ValidateScript検証属性のスクリプトブロック内ではパラメーター変数です。
$args関数の未宣言のパラメーターの配列です。
$ConfirmPreference確認プロンプトを表示する基準です。ConfirmImpactが$ConfirmPreference以上の場合は確認プロンプトを表示します。
$ConfirmPreferenceがNoneの場合は、-Confirmパラメーターを指定しても確認プロンプトを表示しません。
$ConsoleFileName現在のコンソールファイルの名前です。PowerSehll.exeのパラメーターの-PSConsoleFileで指定したファイル名です。Export-Consoleコマンドレットでファイルに保存します。
$DebugPreferenceデバッグメッセージが配信された場合に行う動作を指定します。(Continue、Inquire、SilentlyContinue、Stop)
コマンドレットは、-ErrorActionパラメーターを使用してください。
$Errorエラー情報です。メッセージは、$Error[0].Exception.Messageです。型は、$Error[0].InnerException.GetType().Fullname
$ErrorActionPreferenceエラーメッセージが配信された場合に行う動作を指定します。(Continue、Inquire、SilentlyContinue、Stop、Suspend)
コマンドレットは、-ErrorActionパラメーターで指定してください。
$ErrorViewエラーを表示する際の表示モードを指定します。既定は、NormalViewで構造化ビューは、CategoryViewです。
$ExecutionContextコマンドレットで使用できる実行オブジェクトです。
$EventArgsイベントのEventArgsから派生した最初のイベント引数のオブジェクトです。
$EventSubscriberイベント サブスクライバーを表すPSEventSubscriberオブジェクトです。
$false[Boolean]型のFalseです。
$FormatEnumerationLimitIEnumerableオブジェクトを書式設定する場合の列挙の制限を指定します。
$HOME現在のユーザープロファイルが格納されているフォルダーです。
$ForEachForEachループの列挙子です。
$Host現在のrunspaceのホストへの参照です。
$InformationPreferenceコマンドが情報ストリーム内に項目を生成した場合に行う動作を指定します。
$inputパイプラインの入力のオブジェクトです。
$LastExitCodeWin32ネイティブのプログラムの終了コードです。多くの場合は、0は正常、0以外はエラーです。
$LogCommandHealthEvent
$LogCommandLifecycleEvent
$LogEngineHealthEvent
$LogEngineLifecycleEvent
$LogProviderHealthEvent
$LogProviderLifecycleEvent
イベントログに書き込むPowerShellのイベントを有効・無効にします。
$Matches-Matchか-NotMatch演算子で一致した文字列値のハッシュです。
$MaximumAliasCountセッションで許可されるエイリアスの最大数です。
$MaximumDriveCountセッションで許可されるドライブの最大数です。
$MaximumErrorCountセッションで保持されるエラーの最大数です。
$MaximumFunctionCountセッションで許可される関数の最大数です。
$MaximumHistoryCountセッションで保持される履歴オブジェクトの最大数です。
$MaximumVariableCountセッションで許可される変数の最大数です。
$MyInvocation実行したスクリプトの名前などの情報です。「$MyInvocation.MyCommand.Name」はファイル名です。
$NestedPromptLevel現在の入れ子のレベルで表示するプロンプトの種類を指定します。Prompt関数で使います。
$nullnull値です。
$OFS出力フィールドの区切り記号です。
$OutputEncodingテキストをネイティブ実行可能ファイルにパイプしているときに使用されるテキストエンコーディングです。既定はShift JISです。
$PID現在のプロセスIDです。
$profile起動時に実行するプロファイルです。
$ProgressPreference進行状況記録が配信された場合の動作を指定します。
$PSBoundParametersパラメーターの連想配列です。
$PSCmdlet高度な関数を表すオブジェクトです。(ParameterSetNameプロパティ、ShouldProcessメソッドと ShouldContinueメソッド、ThrowTerminatingErrorメソッドなど)
$PSCommandPath実行したスクリプトのフルパス名です。
$PSCulture現在のWindowsPowerShellセッションのカルチャです。日本語環境は「ja-JP」です。
$PSDebugContextデバッグ中のデバッグ環境に関する情報です。
$PSDefaultParameterValuesコマンドレットの省略値のパラメーターの連想配列です。
$PSEdition現在のPowerShellセッションのエディション情報です。
$PSEmailServer電子メールサーバーの名前を格納する変数です。これは、Send-MailMessageコマンドレットのHostNameパラメーターの代わりに使用できます。
$PSHOME現在のrunspaceのホストアプリケーションの親フォルダーです。C:\Windows\System32\WindowsPowerShell\v1.0
$PSItem$_ と同じで、パイプラインのオブジェクトです。ValidateScript検証属性のスクリプトブロック内ではパラメーター変数です。
$PSModuleAutoloadingPreferenceモジュールの自動インポートを有効・無効にします。(All、ModuleQualified、None)
$PSScriptRoot実行したスクリプトの親フォルダーです。
$PSSenderInfoPSSessionを開始したユーザーに関する情報です。
$PSSessionApplicationNameリモート接続が確立されるアプリケーション名です。
$PSSessionConfigurationNameリモートコンピューターに読み込まれるセッション構成の名前です。
$PSSessionOption新しいリモートセッションの既定のセッションオプションです。
$PSUICulture現在のWindowsPowerShellセッションのUIカルチャです。日本語環境は「ja-JP」です。
$PSUnsupportedConsoleApplicationsサポートしないコマンドのハッシュです。
$PSVersionTable現在のWindows PowerShellセッションのバージョン情報です。
$PWDカレント ディレクトリです。[System.Environment]::CurrentDirectory とは一致しない場合があります。
$Senderイベントを生成したオブジェクトです。
$ShellId現在のシェルを識別します。
$StackTraceスタックトレースの情報です。
$thisスクリプトプロパティまたはスクリプトメソッドを定義するスクリプトブロック内でオブジェクトを参照します。
$true[Boolean]型のTrueです。
$VerbosePreference詳細メッセージが配信された場合の動作を指定します。(Continue、Inquire、SilentlyContinue、Stop)
$WarningPreference警告メッセージが配信された場合の動作を指定します。(Continue、Inquire、SilentlyContinue、Stop)
$WhatIfPreferencetrueの場合は、すべてのコマンドに対して-WhatIfパラメーターが有効と見なされます。

PS > Get-ChildItem *.tmp

PS > Get-Help $^
「$^」は最後のコマンドラインの最初のトークンなので「Get-Help $^」は、「Get-Help Get-ChildItem」を実行します。

PS > Get-ChildItem *.tmp

PS > Remove-Item $$
「$$」は最後のコマンドラインの最後のトークンなので「Remove-Item $$」は、「Remove-Item *.tmp」を実行します。

PS > Get-Help Get-ChildItem

PS > &$$ *.PS1
「$$」は最後のコマンドラインの最後のトークンなので「$$」は「Get-ChildItem」になり、呼び出し演算子の&により「Get-ChildItem *.PS1」を実行します。

このページの上