PowerShell文字列の書式設定: 基本をマスターする

文字列型はおそらくPowerShellで最も人気のある変数です。私が書いたスクリプトの中に、少なくとも1つの文字列が含まれていないことはないと思います。文字列は、コンピュータの名前、テキストファイルへのパス、レジストリキーパス、URLなど、単純な文字のセットを定義するために非常に便利です。文字列内の変数の展開やPowerShellの文字列フォーマット機能を使用することで、ほとんど何でもできます。

文字列は、シングルクォートまたはダブルクォートで1つ以上の文字を囲むことによって定義されます。

$Url = 'http:\\www.bing.com'
$FilePath = 'C:\thisissomefile.txt'

このように文字列を定義するのは簡単ですが、すぐに文字列内の変数の値を取得する必要があることに気づくでしょう。

たとえば、スクリプトにComputerNameパラメータがあり、スクリプト内でそれに標準の接頭辞を連結する必要がある場合、以下のようにSRV-を使用します。

$ComputerName = 'URANUS'
$ComputerName = "SRV-$ComputerName"

ここで$ComputerName変数の値はSRV-URANUSですが、ダブルクォートで$ComputerNameを囲むだけで変数を文字列に挿入する方法は1つだけではありません。それを実現するためのいくつかの異なる方法があります。2つの例を見てみましょう。

文字列の展開

最初の方法は、おそらく既におなじみの「文字列の展開」と呼ばれる方法で、既存の文字列内の変数を単純に展開するものです。これは変数の値を文字列に表示するための最も一般的な方法です。

これを行うには、変数をダブルクォートで囲まれた文字列内に配置する必要があります。シングルクォートではすべての文字を文字通りに扱うため、機能しません。

たとえば、ファイルへのパスを指定する必要があるかもしれません。基本フォルダのパスはわかりますが、実際のファイル名はまだわかりません。変数$FullPathを作成し、フォルダのパスを静的に入力しますが、ファイル名を変数にします。

PS> $FileName = 'MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$FileName"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

文字列内のオブジェクトプロパティを指定する必要がある場合、少し異なります。この場合、プロパティを括弧で囲み、先頭にドル記号を付け加える必要があります。これはサブ式演算子と呼ばれます。これにより、PowerShellに値を最初に展開するように指示されます。

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$($File.Name)"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

文字列の展開は非常に一般的ですが、より複雑な文字列がある場合はどうなるでしょうか?

PowerShellの文字列フォーマット演算子を使用する

文字列に変数値を挿入する別の方法は、Powershellのフォーマット演算子(-f)を使用することです。

フォーマット演算子を使用すると、変数やプロパティを二重引用符で囲まれた文字列内に配置する必要はありません。以下に示すように、文字列を単一引用符で作成し、その外側にその文字列に入る変数を指定できます。

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> 'C:\Folder\subfolder\{0}' -f $File.Name
C:\Folder\subfolder\MyFile.txt

それが全く同じ効果を持っていることがわかります。今回は二重引用符を使用したり、プロパティを括弧ともう1つのドル記号で囲んだりする必要がありませんでした。少しクリーンに見えますが、理解するのが難しいかもしれません。フォーマット演算子を使用すると、心の中で{0}$File.Nameに置き換える必要があります。

他の変数を追加するには、ラベルを1つ増やし、フォーマット演算子にコンマで区切られた変数を追加し続けてください。フォーマット演算子のインデックス位置が文字列ラベルの位置と一致している限り、参照を好きなだけ追加できます。

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $SubFolderName = 'folder1'
PS> 'C:\Folder\subfolder\{0}\{1}' -f $SubFolderName, $File.Name
C:\Folder\subfolder\folder1\MyFile.txt

フォーマット演算子の使用方法

I usually prefer to place variables inside of the string and expand them because I don’t have to match an index with a value. However, there are exceptions, as in the case of special characters that must be escaped.

例えば、ファイル名を渡す必要があるコマンドラインユーティリティを実行する必要があるとします。このファイルパスにはスペースが含まれている可能性があるため、その参照を二重引用符で囲む必要があります。これらの二重引用符がないと、utility.exeはファイル引数を正しく解釈できません。

Utility.exe -file "C:\Program Files\SomeFolder\a subfolder here"

次に、PowerShellスクリプトでこれを行う場合を考えてみましょう。展開文字列を使用している場合、二重引用符をエスケープするためにバッククォートを使用する必要があるため、少し見にくくなります。

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
Start-Process -FilePath 'utility.exe' -Args "`"$FileName`""

では、同じ結果をフォーマット演算子を使用して取得しましょう。

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
$Args = '"{0}"' -f $FileName
Start-Process -FilePath 'utility.exe' -Args $Args

I don’t have to use any escape characters. This may seem like a simple example but as soon as you come across large strings that require a lot of escaping you will soon see the real benefit of using the format operator!

まとめ

次に、文字列内で変数を置換する必要がある場合は、どの方法が最も読みやすいかを考えてみてください。長い目で見れば時間を節約できます。

文字列操作に関連する他の投稿については、PowerShell Substring: 文字列内の文字列の検索PowerShell変数を文字列に埋め込むをチェックしてください。

Source:
https://adamtheautomator.com/powershell-string-format/