次の方法で共有


コメントについて

簡単な説明

PowerShell のコメントとリストの特殊なユース ケースの使用方法について説明します。

長い説明

読みやすくするために、PowerShell コードに注釈を付けたり、構造化したりするためのコメントを記述できます。 コードを実行すると、PowerShell ではコメント テキストは無視されます。

コメントは、コードの閲覧者に重要なコンテキストを提供します。 コメントは、次の目的に使用する必要があります。

  • 複雑なコードを簡単な用語で説明する
  • 特定のアプローチが選択された理由を説明する
  • 注意する必要がある特異ケースを文書化する
  • サポート参照資料へのリンクを提供する

一部のコメントは、PowerShell で特別な意味を持ちます。 特別なコメントを参照してください。

PowerShell のコメント スタイル

PowerShell では、次の 2 つのコメント スタイルがサポートされています。

  • 1 行のコメント ハッシュ文字 (#) で始まり、改行で終わる必要があります。 # の前には、コメントの一部ではないテキスト (空白を含む) を付けることができます。 コメントなしのソース コードと同じ行に配置された 1 行のコメントは、行末コメントと呼ばれます。

  • コメントをブロック<# で始まり、#>で終わる。 ブロック コメントは任意の数の行にまたがることができ、コメントされていないソース コードの前、後、または途中に含めることができます。 ブロック内のすべてのテキストは、空白を含め、同じコメントの一部として扱われます。

    重要

    ブロック コメント内に 1 行のコメントを含めることができます。 ただし、ブロック コメントを入れ子にすることはできません。 ブロックコメントをネストしようとすると、外側のブロックコメントは最初に現れた #> で終了します。

例の一覧

例 1: 1 行のコメント

# This is a single-line comment.
# This is also a single-line comment.

例 2: コメントをブロックする

<#
    This is a block comment.
    Text within the block is a part of the same comment.
Whitespace is unimportant in a block comment.
#>

例 3: 行末コメント

$var = 4 # This is an end-of-line comment

例 4: インライン ブロック コメント

'Foo'; <# This is an inline block comment #> 'Bar'

例 5: 完全な例

<#
    .DESCRIPTION
    Demonstrates PowerShell's different comment styles.
#>
param (
    [string] $Param1, # End-of-line comment
    <# Inline block comment #> $Param2
)

$var = 1, <# Inline block comment #> 2, 2

# Single-line comment.
# Another single-line comment.
$var.Where(
    <# Arg1 note #> { $_ -eq 2 },
    <# Arg2 note #> 'First',
    <# Arg3 note #> 1
)

特別なコメント

PowerShell には、特定の用途をサポートするいくつかのコメント キーワードが含まれています。

コメントベースのヘルプ

1 行またはブロックのコメントを使用して、関数とスクリプトのコメントベースのヘルプ コンテンツを記述できます。 ユーザーは、Get-Help コマンドレットを使用して、関数またはスクリプトのコメント ベースのヘルプを表示できます。 PowerShell では、説明や使用例などの情報を提供するために使用できる 15 個のコメント キーワードが定義されています。

<#
    .DESCRIPTION
    Comment-based help using a block comment.
#>
function Get-Function { }
# .DESCRIPTION
# Comment-based help using multiple single-line comments.
function Get-Function { }

詳細については、以下を参照してください。

#Requires

#Requires ステートメントは、現在の PowerShell セッションが指定された前提条件を満たしていない限り、スクリプトを実行できないようにします。 #Requires はスクリプト内の任意の行に表示できますが、位置に関係なく同じ方法で処理されます。

#Requires -Modules AzureRM.Netcore
#Requires -Version 6.0

param (
    [Parameter(Mandatory)]
    [string[]] $Path
)

詳しくは、「about_Requires」をご覧ください。

署名ブロック

スクリプトは、PowerShell 実行ポリシーに準拠するように署名できます。 署名されると、署名ブロックがスクリプトの末尾に追加されます。 このブロックは、スクリプトを実行する前に PowerShell によって読み取られた複数の 1 行のコメントの形式をとります。

# SIG # Begin signature block
# ...
# SIG # End signature block

詳細については、「about_signing」を参照してください。

シバン

Unix に似たシステムでは、shebang (#!) はスクリプトの先頭で使用されるディレクティブで、スクリプトの実行に使用するシェルを示します。 Shebang は PowerShell 言語の一部ではありません。 PowerShell では、通常のコメントとして解釈されます。 Shebang はオペレーティング システムによって解釈されます。

次の例では、スクリプトが PowerShell 以外のコンテキストから呼び出されたときに、shebang によって PowerShell によってスクリプトが実行されます。

#!/usr/bin/env pwsh
Write-Host 'Begin script'

コード エディター領域マーカー

一部のコード エディターでは、コードのセクションを折りたたんで展開できる領域マーカーがサポートされています。 PowerShell の場合、領域マーカーは、#region で始まり、#endregionで終わるコメントです。 領域マーカーは、線の先頭にある必要があります。 リージョン マーカーは、PowerShell ISE と Visual Studio Code と PowerShell 拡張機能でサポートされています。 リージョン マーカーは PowerShell 言語の一部ではありません。 PowerShell では、通常のコメントとして解釈されます。

詳細については、Visual Studio Code ドキュメントの Basic 編集の「フォールディング」セクションを参照してください。

文字列トークン内のコメント

#<# #> は、展開可能な または 文字列内で特別な意味を持っていません。 PowerShell は文字を文字として解釈します。

PS> '# This is not interpreted as a comment.'
# This is not interpreted as a comment.

PS> "This is <# also not interpreted #> as a comment."
This is <# also not interpreted #> as a comment.

ただし、特定の PowerShell 機能は、コメントを含む文字列を操作するように設計されています。 コメントの解釈は、特定の機能によって異なります。

正規表現のコメント

PowerShell の正規表現 (正規表現) では、2 つのコメント スタイルをサポートする .NET regex エンジンが使用されます。

  • インライン コメント ((?#))
  • 行末コメント (#)

正規表現コメントは、PowerShell のすべての正規表現ベースの機能でサポートされています。 例えば:

PS> 'book' -match '(?# This is an inline comment)oo'
True

PS> 'book' -match '(?x)oo# This is an end-of-line comment'
True

PS> $regex = 'oo # This is an end-of-line comment'
PS> 'book' -split $regex, 0, 'IgnorePatternWhitespace'
b
k

手記

行末の正規表現コメントには、(?x) コンストラクトまたは IgnorePatternWhitespace オプションのいずれかが必要です。

詳細については、以下を参照してください。

JSON コメント

PowerShell 6.0 以降、ConvertFrom-Json コマンドレットでは、次の JSON コメント スタイルがサポートされています。

  • 1 行コメント (//)
  • コメントをブロックする (/* */)

手記

Invoke-RestMethod コマンドレットは、受信した JSON データを自動的に逆シリアル化します。 PowerShell 6.0 以降では、JSON データでコメントが許可されます。

例えば:

'{
    "Foo": "Bar" // This is a single-line comment
}' | ConvertFrom-Json
Foo
---
Bar

警告

PowerShell 7.4 以降、Test-Json コマンドレットはコメント付きの JSON をサポートしなくなりました。 JSON にコメントが含まれている場合は、エラーが返されます。 7.4 より前のサポートされているバージョンでは、Test-Json はコメントを使用して JSON を正常に解析します。 PowerShell 7.5 では、Test-Json には JSON コメントを無視するオプションが含まれています。

CSV コメント

Import-Csv と ConvertFrom-Csv は、W3C 拡張ログ形式をサポートします。 ハッシュ文字 (#) で始まる行はコメントとして扱われ、コメントが #Fields: で始まり、列名の区切りリストが含まれている場合を除き、無視されます。 その場合、コマンドレットはこれらの列名を使用します。 これは、Windows IIS およびその他の Web サーバー ログの標準形式です。 詳細については、「拡張ログ ファイル形式 」を参照してください。

@'
# This is a CSV comment
Col1,Col2
Val1,Val2
'@ | ConvertFrom-Csv
Col1 Col2
---- ----
Val1 Val2

Windows PowerShell 5.1 では、既定の Export-Csv および ConvertTo-Csv の動作は、#TYPE コメントの形式で型情報を含めるようになっています。 PowerShell 6.0 以降、既定ではコメントは含まれませんが、これは IncludeTypeInformation パラメーターでオーバーライドできます。

[pscustomobject] @{ Foo = 'Bar' } | ConvertTo-Csv -IncludeTypeInformation
#TYPE System.Management.Automation.PSCustomObject
"Foo"
"Bar"

#TYPE コメントが CSV データに含まれている場合、Import-Csv および ConvertFrom-Csv この情報を使用して、逆シリアル化されたオブジェクトの pstypenames プロパティを設定します。

class Test { $Foo = 'Bar' }
$test = [Test]::new()

$var = $test | ConvertTo-Csv -IncludeTypeInformation | ConvertFrom-Csv
$var.pstypenames
Test
CSV:Test

ConvertFrom-StringData コメント

ConvertFrom-StringData コマンドレットは、文字列データ内で、# で始まる行をコメントとして扱います。 詳細については、以下を参照してください。

メモ

  • ブロック コメントを入れ子にすることはできません。 次の例では、Baz はコメントの一部ではありません。

    <#
    'Foo'
    <# 'Bar' #>
    'Baz'
    #>
    
  • <# #> は、1 行のコメント内で特別な意味を持つ必要はありません。 # はブロック コメント内で特別な意味を持っていません。

  • コメントとして扱うには、コメント文字をコメント以外のトークンの一部にすることはできません。 次の例では、#Bar<#Bar#>Foo... トークンの一部です。 したがって、コメントとして扱われることはありません。

    PS> Foo#Bar
    Foo#Bar: The term 'Foo#Bar' is not recognized as a name [...]
    
    PS> Foo<#Bar#>
    Foo<#Bar#>: The term 'Foo<#Bar#>' is not recognized as a name [...]