about_Quoting_Rules

簡単な説明

PowerShell で単一引用符と二重引用符を使用するための規則について説明します。

長い説明

引用符はリテラル文字列を指定するために使用されます。 文字列は、単一引用符 () または二重引用符 ('") で囲むことができます。

引用符は、ここの文字列作成するためにも使用されます。 here-string は、引用符がリテラルで解釈される単一引用符または二重引用符で囲まれた文字列です。 here 文字列は複数行にまたがる場合があります。 この文字列内のすべての行は、引用符で囲まれていない場合でも、文字列として解釈されます。

リモート コンピューターに対するコマンドでは、リモート コンピューターで実行されるコマンドの部分を引用符で定義します。 また、リモート セッションでは、コマンド内の変数が最初にローカル コンピューターまたはリモート コンピューターで解釈されるかどうかも、引用符によって決まります。

二重引用符で囲まれた文字列

二重引用符で囲まれた文字列は、展開可能な 文字列です 。 ドル記号 ($) で始まる変数名は、処理のために文字列がコマンドに渡される前に変数の値に置き換えられます。

次に例を示します。

$i = 5
"The value of $i is $i."

このコマンドの出力は次のとおりです。

The value of 5 is 5.

また、二重引用符で囲まれた文字列では、式が評価され、結果が文字列に挿入されます。 次に例を示します。

"The value of $(2+3) is 5."

このコマンドの出力は次のとおりです。

The value of 5 is 5.

展開可能な文字列に直接埋め込むことができるのは、基本変数参照だけです。 配列インデックス作成またはメンバー アクセスを使用する変数参照は、部分式で囲む必要があります。 次に例を示します。

"PS version: $($PSVersionTable.PSVersion)"
PS version: 7.2.0

変数名を文字列内の後続の文字から分離するには、中かっこ ({}) で囲みます。 これは、変数名の後にコロン (:) が続く場合に特に重要です。 PowerShell では、スコープ指定子とスコープ指定子の$:間のすべてを考慮し、通常は解釈が失敗します。 たとえば、 "$HOME: where the heart is." エラーをスローしますが "${HOME}: where the heart is." 、意図したとおりに動作します。

二重引用符で囲まれた文字列内の変数値が置換されないようにするには、PowerShell エスケープ文字であるバッククォート文字 (`) を使用します。

次の例では、最初 $i の変数の前にあるバックティック文字を使用すると、PowerShell で変数名をその値に置き換えなくなります。 次に例を示します。

$i = 5
"The value of `$i is $i."

このコマンドの出力は次のとおりです。

The value of $i is 5.

単一引用符で囲まれた文字列

単一引用符で囲まれた文字列は、逐語的な 文字列です 。 文字列は、入力したとおりにコマンドに渡されます。 置換は実行されません。 次に例を示します。

$i = 5
'The value of $i is $i.'

このコマンドの出力は次のとおりです。

The value $i is $i.

同様に、単一引用符で囲まれた文字列内の式は評価されません。 これらは文字列リテラルとして解釈されます。 次に例を示します。

'The value of $(2+3) is 5.'

このコマンドの出力は次のとおりです。

The value of $(2+3) is 5.

文字列に引用符文字を含める

文字列に二重引用符を表示するには、文字列全体を単一引用符で囲みます。 次に例を示します。

'As they say, "live and learn."'

このコマンドの出力は次のとおりです。

As they say, "live and learn."

一重引用符で囲む文字列を二重引用符で囲むこともできます。 次に例を示します。

"As they say, 'live and learn.'"

このコマンドの出力は次のとおりです。

As they say, 'live and learn.'

または、二重引用符で囲まれた語句を二重引用符で囲みます。 次に例を示します。

"As they say, ""live and learn."""

このコマンドの出力は次のとおりです。

As they say, "live and learn."

単一引用符で囲まれた文字列に単一引用符を含めるには、2 番目の連続する単一引用符を使用します。 次に例を示します。

'don''t'

このコマンドの出力は次のとおりです。

don't

PowerShell で二重引用符をリテラルで解釈するように強制するには、バッククォート文字を使用します。 これにより、PowerShell が引用符を文字列区切り記号として解釈できなくなります。 次に例を示します。

"Use a quotation mark (`") to begin a string."
'Use a quotation mark (`") to begin a string.'

一重引用符で囲まれた文字列の内容はリテラルで解釈されるため、バックティック文字はリテラル文字として扱われ、出力に表示されます。

Use a quotation mark (") to begin a string.
Use a quotation mark (`") to begin a string.

Here-strings

ここでの文字列の引用符の規則は少し異なります。

ここの文字列は、一重引用符 () で@囲まれた単一引用符または二重引用符で囲まれた文字列です。 この文字列内の引用符は、リテラルで解釈されます。

次の文字列:

  • 複数の行にまたがる
  • 開始記号の後に改行で始まる
  • 終わりが改行で終わり、その後に終了マークが付きます。
  • には、1 つの文字列の一部として、開始記号と終了記号の間のすべての行が含まれます

通常の文字列と同様に、変数は二重引用符で囲まれた文字列の値に置き換えられます。 ここで一重引用符で囲まれた文字列では、変数は値に置き換えられません。

任意のテキストに対して here 文字列を使用できますが、次の種類のテキストに特に役立ちます。

  • リテラル引用符を含むテキスト
  • HTML ブロックまたは XML ブロック内のテキストなど、複数行のテキスト
  • スクリプトまたは関数ドキュメントのヘルプ テキスト

この文字列には、<Enter>Enter キーを押したときに追加される改行文字または改行隠し文字を表す、次のいずれかの形式を使用できます。

二重引用符:

@"<Enter>
<string> [string] ...<Enter>
"@

単一引用符:

@'<Enter>
<string> [string] ...<Enter>
'@

Note

最後の改行文字は終了記号の一部です。 この文字列には追加されません。

この文字列には、開始記号と終了記号の間のすべてのテキストが含まれます。 この文字列では、すべての引用符がリテラルで解釈されます。 次に例を示します。

@"
For help, type "get-help"
"@

このコマンドの出力は次のとおりです。

For help, type "get-help"

here-string を使用すると、コマンドでの文字列の使用を簡略化できます。 次に例を示します。

@"
Use a quotation mark, like ' or ", to begin a string.
"@

このコマンドの出力は次のとおりです。

Use a quotation mark, like ' or ", to begin a string.

ここで一重引用符で囲まれた文字列では、変数はリテラルで解釈され、正確に再現されます。 次に例を示します。

@'
The $profile variable contains the path
of your PowerShell profile.
'@

このコマンドの出力は次のとおりです。

The $profile variable contains the path
of your PowerShell profile.

ここで二重引用符で囲まれた文字列では、変数はその値に置き換えられます。 次に例を示します。

@"
Even if you have not created a profile,
the path of the profile file is:
$profile.
"@

このコマンドの出力は次のとおりです。

Even if you have not created a profile,
the path of the profile file is:
C:\Users\User1\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1.

Here 文字列は、通常、変数に複数の行を割り当てるために使用されます。 たとえば、次の文字列は XML のページを$page変数に割り当てます。

$page = [XML] @"
<command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10"
xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10"
xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
<command:details>
        <command:name>
               Format-Table
        </command:name>
        <maml:description>
            <maml:para>Formats the output as a table.</maml:para>
        </maml:description>
        <command:verb>format</command:verb>
        <command:noun>table</command:noun>
        <dev:version></dev:version>
</command:details>
...
</command:command>
"@

Here 文字列はコマンドレットへの ConvertFrom-StringData 入力にも便利な形式で、here 文字列をハッシュ テーブルに変換します。 詳細については、「ConvertFrom-StringData」を参照してください。

Note

PowerShell を使用すると、二重引用符または一重引用符で囲まれた文字列を、ここの文字列の構文を @ 使用せずに複数の行にまたがることができます。 ただし、完全な文字列構文を使用することをお勧めします。

展開可能な文字列の解釈

展開された文字列は、コンソールに表示される既定の出力と必ずしも同じとは限りません。

配列を含むコレクションは、要素の文字列表現の間に 1 つのスペースを配置することで、文字列に変換されます。 ユーザー設定変数 $OFSを設定することで、別の区切り記号を指定できます。 詳細については、基本設定変数$OFS参照してください。

他の型のインスタンスは、メソッドを呼び出 ToString() すことによって文字列に変換されます。意味のある表現が得られない可能性があります。 次に例を示します。

"hashtable: $(@{ key = 'value' })"
hashtable: System.Collections.Hashtable

コンソールと同じ出力を取得するには、パイプ Out-String先の部分式を使用します。 先頭と末尾の Trim() 空の行を削除する場合は、メソッドを適用します。

"hashtable:`n$((@{ key = 'value' } | Out-String).Trim())"
hashtable:
Name                           Value
----                           -----
key                            value

引用符で囲まれた文字列を外部コマンドに渡す

一部のネイティブ コマンドでは、引用符文字を含む引数が必要です。 PowerShell は、引用符で囲まれた文字列を外部コマンドに渡す前に解釈します。 この解釈により、外側の引用符文字が削除されます。

この動作の詳細については、about_Parsingの記事を参照してください。

関連項目