about_Quoting_Rules
簡単な説明
PowerShell で単一引用符と二重引用符を使用するための規則について説明します。
詳細な説明
解析時に、PowerShell はまず入力を式として解釈します。 ただし、コマンド呼び出しが発生すると、解析は引数モードで続行されます。 引用符のない数値以外の引数は文字列として扱われます。 パスなどのスペースを含む引数がある場合は、それらの引数値を引用符で囲む必要があります。 引数の解析の詳細については、about_Parsingの「Argument mode」セクションを参照してください。
引用符はリテラル文字列を指定するために使用されます。 文字列は、単一引用符 ('
) または二重引用符 ("
) で囲むことができます。
引用符は、 here 文字列の作成にも使用されます。 here-string は、引用符がリテラルで解釈される単一引用符または二重引用符で囲まれた文字列です。 here 文字列は複数行にまたがる場合があります。 この文字列内のすべての行は、引用符で囲まれていない場合でも、文字列として解釈されます。
リモート コンピューターに対するコマンドでは、リモート コンピューターで実行されるコマンドの部分を引用符で定義します。 また、リモート セッションでは、コマンド内の変数が最初にローカル コンピューターまたはリモート コンピューターで解釈されるかどうかも、引用符によって決まります。
Note
PowerShell では、スマート引用符 (文字体裁または中引用符とも呼ばれます) は、文字列の通常の引用符として扱われます。 スマート引用符を使用して文字列を囲まないでください。 スマート引用符を含む文字列を記述する場合は、このドキュメントの「 文字列内の引用符文字を含む 」セクションのガイダンスに従ってください。 スマート引用符の詳細については、Wikipedia の記事「 Smart Quotes 」セクション 英語の引用マークを参照してください。
二重引用符で囲まれた文字列
二重引用符で囲まれた文字列は、 説明可能な 文字列です。 ドル記号 ($
) で始まる変数名は、処理のために文字列がコマンドに渡される前に変数の値に置き換えられます。
次に例を示します。
$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: 5.1.22621.4111
変数名を文字列内の後続の文字から分離するには、中かっこ ({}
) で囲みます。 これは、変数名の後にコロン (:
) が続く場合に特に重要です。 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.
単一引用符で囲まれた文字列
単一引用符で囲まれた文字列は、 verbatim 文字列です。 文字列は、入力したとおりにコマンドに渡されます。 置換は実行されません。 次に例を示します。
$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.
PowerShell は、 ‘
、 ’
、 “
、 ”
などのスマート引用符を通常の引用符として解釈するため、スマート引用符もエスケープする必要があります。
次に例を示します。
"Double ““smart quotation marks`” must be escaped in a double-quoted string."
'Single ‘‘smart quotation marks’’ must be escaped in a single-quoted string.'
Double “smart quotation marks” must be escaped in a double-quoted string.
Single ‘smart quotation marks’ must be escaped in a single-quoted string.
Here-strings
ここでの文字列の引用符の規則は少し異なります。
here-string は、記号 (@
) で囲まれた一重引用符または二重引用符で囲まれた文字列です。 この文字列内の引用符は、リテラルで解釈されます。
次の文字列:
- 複数の行にまたがる
- 開始記号の後に改行で始まる
- 終わりが改行で終わり、その後に終了マークが付きます。
- には、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 を使用すると、二重引用符または一重引用符で囲まれた文字列を、here 文字列の @
構文を使用せずに複数の行にまたがることができます。 ただし、完全な文字列構文を使用することをお勧めします。
展開可能な文字列の解釈
展開された文字列は、コンソールに表示される既定の出力と必ずしも同じとは限りません。
配列を含むコレクションは、要素の文字列表現の間に 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
カルチャ設定が文字列の解釈に影響する
ToString()
メソッドは、現在構成されているカルチャ設定を使用して値を文字列に変換します。 たとえば、次の PowerShell セッションのカルチャは de-DE
に設定されます。 ToString()
メソッドは、$x
の値を文字列に変換するときに、小数点区切り記号にコンマ (,
) を使用します。 また、 ToString()
メソッドは、ドイツ語のロケール設定に適した形式を使用して、日付を文字列に変換します。
PS> Get-Culture
LCID Name DisplayName
---- ---- -----------
1031 de-DE German (Germany)
PS> $x = 1.2
PS> $x.ToString()
1,2
PS> (Get-Date 2024-03-19).ToString()
19.03.2024 00:00:00
ただし、PowerShell では、展開可能な文字列式を解釈するときにインバリアント カルチャが使用されます。
PS? "$x"
1.2
PS> "$(Get-Date 2024-03-19)"
03/19/2024 00:00:00
引用符で囲まれた文字列を外部コマンドに渡す
一部のネイティブ コマンドでは、引用符文字を含む引数が必要です。 PowerShell は、引用符で囲まれた文字列を外部コマンドに渡す前に解釈します。 この解釈により、外側の引用符文字が削除されます。
この動作の詳細については、 about_Parsing の記事を参照してください。
関連項目
PowerShell