あなたが求めるのはパスを分割して特定の部分を取得することですか?その場合、PowerShellのSplit-Path
が頼りになります。ファイル、証明書、レジストリといったものを扱うと、パスはそれらの場所を表します。
そして、ある時点で、たとえば自動化の際に、パスのどの部分を返すかをフィルタリングする必要が出てくるかもしれません。あなたに幸運が訪れました。このチュートリアルでは、PowerShellのSplit-Path
コマンドレットの使用方法を教えます。
さあ!読み続けて、PowerShellの武器庫に新しい武器を手に入れましょう!
前提条件
この実践的なチュートリアルの例に従う予定がある場合は、PowerShell 5.1以上が実行されている任意の現代のWindowsバージョンが必要です。このチュートリアルでは、PowerShell 7.1.1を搭載したWindows 10 20H2を使用します。
パスには何が含まれていますか?
PowerShellのSplit-Path
コマンドレットで深く掘り下げる前に、パスが何であるかを確認しましょう。パスは特定の形式に従うアイテムの位置を決定します。
たとえば、ファイルのパスはC:\demo\subfolder1\TestFile_11.txtのようになります。このパスを部分に分割すると、次のようになります:
- C: is the drive or the qualifier, or the specified path. The qualifier is the part of the path from the left up to the colon (
:
) character. - \demo\subfolder1\はフォルダとサブフォルダまたはコンテナです。
- TestFile_11.txtはファイル名またはリーフです。リーフはパスの最後の要素または部分です。
ただし、パスはファイルやフォルダに限定されるものではありません。他の有効なパスには次のようなものがあります:
- Certificate (e.g., Cert:\CurrentUser\My)
- Registry (e.g., HKCU:\Software)
- Function (e.g., Function:\New-Guid)
- Variable (e.g., Variable:\PSEdition)
- Active Directory (e.g., AD:\CN=Users,DC=Constoso,DC=com)
PowerShellのSplit-Pathパラメータ
Split-Path
は、他のコマンドレットと同様に、その動作と出力を操作するためのパラメータを持っています。これらのパラメータがPowerShellのSplit-Path
の構文を構成します。
-Path
– このパラメータは、分割したい1つ以上のパス文字列を受け入れます。また、パイプライン入力も受け入れます。パス内のワイルドカードも受け付けます。-LiteralPath
–-Path
パラメータと同様に、-LiteralPath
パラメータも分割するパスを受け入れます。ただし、このパラメータを使用してパスを指定する場合、ワイルドカードは解釈されません。-Resolve
– このパラメータを使用すると、Split-Path
コマンドレットは指定したパスで参照されるファイルやアイテムを解決します。リテラルな性質のため、このパラメータを-LiteralPath
パラメータと同時に使用することはできません。-IsAbsolute
– このパラメーターは、指定したパスが絶対パスかどうかを決定するブール値を返します。
PowerShellの
Split-Path
コマンドレットには、-Credential
というパラメーターもありますが、これはPSCredentialオブジェクトを受け入れるとされています。しかし、Microsoftによると、このパラメーターは、標準で提供されているPowerShellプロバイダーのいずれにもサポートされておらず、使用するとエラーが発生します。
次のパラメーターは、分割位置パラメーターと呼ばれます。これらのパラメーターは、PowerShellのSplit-Path
コマンドレットに、パスの要素または部分を返すよう指示します。コマンドレットはパスの要素を1つだけ返すことができるため、これらのパラメーターのいずれか一つしか一度に使用できません。
-Parent
– 指定したパスの親ロケーション(アイテムまたはファイル名なし)を返します。このパラメーターは、デフォルトの分割位置パラメーターでもあります。つまり、このパラメーターを省略しても親ロケーションを取得できます。-Leaf
– パスの最後の要素またはリーフのみを返します。-LeafBase
– 拡張子なしのパスの最後の要素またはリーフのみを返します。このパラメーターは、PowerShell 6.0以降でのみ利用可能です。-Extension
-パスの最後のドット “.
” から最後の文字までの拡張子のみを返します。このパラメータはPowerShell 6.0以降でのみ利用可能です。-Qualifier
– パスのドライブまたは修飾子のみを返します。-NoQualifier
– パスからドライブまたは修飾子を削除します。
PowerShell Split-Pathコマンドレットの使用例
PowerShellのSplit-Pathコマンドレットを使用すると、パスの部分を分割して解剖できます。その後、どのパスの部分を返すかを指定できます。出力要件に応じて修飾子、修飾子のないパス、およびファイル名を返すかを選択できます。
パスの親フォルダを取得
パスの親フォルダを返すには、PowerShellのSplit-Path
コマンドレットを実行し、-Parent
パラメータを追加します。
以下の結果は、コマンドが親フォルダのパスを返すことを示しています。

Tip: パラメータなしでPowerShell Split-Pathコマンドレットを実行すると、デフォルトで親フォルダを返します。これは
-Parent
パラメータを使用するのと同じ動作です。
Tip:
-Path
パラメータは複数のパスを受け入れるため、単一のコマンドで複数のパス文字列の値を分割できます。e.g.,
Split-Path -Path 'c:\folder1','c:\folder2'
修飾子なしのパスの表示
別のドライブにフォルダツリーの構造を複製するスクリプトを作成していると想像してください(例:C:\demo\subfolder1からD:\demo\subfolder1)。コードでは、ソースパスを分割して、ドライブレターを除いたフォルダ構造のみを取得することができるようにしたいと思うかもしれません。
修飾子を除いたパスを取得するには、以下のようにPowerShellのSplit-Path
コマンドレットを-NoQualifier
パラメータとともに実行します。このコマンドはパスを分割し、結果からドライブレターを省略します。
以下の結果からわかるように、noQualifier
パラメータを使用すると、修飾子のないパスが返されます。

パスのドライブまたは修飾子の取得
修飾子またはドライブレターのみを返す必要がある場合があります。たとえば、スクリプトでドライブレターに基づいて結果を集計したい場合です。
そのためには、以下のPowerShellのSplit-Path
コマンドを-Qualifier
パラメータとともに実行します。このコマンドはパスを分割し、結果として修飾子の文字列のみを返します。

ファイル、ディレクトリ、またはアイテムの名前の表示
パスを木と考えてみてください。修飾子はその木自体であり、フォルダは枝であり、最後には葉があります。葉はパスの末尾にあるゼロでない文字列です。
パスを分割して葉を取得する必要がある場合は、以下のSplit-Path
コマンドを実行し、-Leaf
パラメータを追加します。
結果として、以下のイメージは、指定したパスからファイル名のみが返されたことを示しています。

ファイル名と拡張子の分割(≥PowerShell 6.0)
注意: このセクションはPowerShell 6.0以降に適用されます。
したがって、パスを分割し、アイテムを返しました。 そして、この場合、アイテムはファイル名(TestFile_11.txt)であり、これにはベースと拡張子の2つの部分があります。 PowerShell Split-Path
コマンドレットを使用して、-LeafBase
および-Extension
パラメータを使用してリーフをこれらの2つの部分にさらに分割できます。
ファイル名のベースと拡張子を取得するには、以下のコマンドを実行してください。
パスに拡張子がない場合、
Extension
パラメータは空の文字列を返します。

ファイル名と拡張子の分割(≤ Windows PowerShell 5.1)
残念ながら、-LeafBase
および-Extension
パラメータはWindows PowerShell 5.1およびそれ以下のバージョンでは使用できません。 ただし、PowerShellのいくつかのマジックを使用すると、Windows PowerShell 5.1しかない場合でもこれらのパラメータの出力を複製できます。
ただし、Split-Path
コマンドレットではなく、次にベストなものを使用します- split()
メソッドと-replace
演算子。
A PowerShell string object, such as the path, contains a split()
method. This method allows you to split a string into multiple elements based on a delimiter character that you provide. And in the case of paths, the delimiter is the (\\
) back-slash character.
一方、-replace
演算子を使用すると、正規表現(RegEx)を使って文字列を置換できます。
-LeafBase
パラメータの結果を模倣するには、PowerShellで以下のコマンドを実行してください。
その結果、以下のスクリーンショットはコマンドがファイル名のベースのみを返したことを示しています。

今度は、ファイル拡張子のみを取得するには、PowerShellで以下のコマンドを実行してください。
以下の結果は、コマンドがファイルの拡張子のみを返したことを示しています – txt
。

パスが絶対かどうかを判断する
システム管理者として、2つのパスタイプに遭遇します—絶対 と 相対。しかし、違いは何でしょうか?絶対パスは C:\demo や HKCU:\Software などの修飾子で始まります。対照的に、相対パスには修飾子がなく、.\demo や \folder1\folder2のようなものです。
PowerShellのSplit-Path
コマンドレットは、-IsAbsolute
パラメータを使用して絶対パスを特定するのに役立ちます。パスが絶対かどうかを判断するには、以下のコマンドを実行します。
下記のように、-isAbsolute
パラメータはパスが絶対か相対かを示すブール値を返します(TRUE
またはFALSE
)。

ワイルドカードを使用したパスの分割と解決
Split-Path
コマンドレットで分割するパスは、存在する必要はありません。パスが存在しているかどうかにかかわらず、このコマンドレットはそれを分割して結果を返します。
しかし、PowerShellのSplit-Path
コマンドレットには、-Resolve
という別のパラメータがあります。このパラメータを使用すると、ワイルドカードで参照されるアイテムを解決できます。このパラメータを使用する場合、分割するパスとその内部のアイテムはすでに存在している必要があります。
たとえば、*.txt
ファイル拡張子に一致するアイテムを返すには、以下のコマンドを実行します。 -Leaf
パラメータを使用すると、コマンドレットが親コンテナーではなくアイテムのみを返します。
(
*
)ワイルドカードは一致する1文字以上を表し、(?
)は1文字のワイルドカードを表します。
以下の結果は、TestFile_11.txtからTestFile_20.txtまでのファイルがリストされています。これらのファイルはすべて.txt
拡張子と一致します。

単一文字の一致を解決するには、アスタリスク(*
)ワイルドカードを(?
)ワイルドカードで置き換えると、以下のコマンドのようになります。
以下の出力は、このファイルが唯一一致するものであるため、ファイルTestFile_20.txtのみを表示します。

パスにエスケープ文字が含まれている場合、例えば、grave-accent(“`”)のように、パスを単一引用符で囲んで解決します。例えば、以下のコマンドは、エスケープ文字を含むパスを分割して解決します。

概念の証明として、そのパスを単一引用符で囲まない場合、コマンドはパスが存在しないというエラーを返します。同じエラーが、代わりに二重引用符を使用した場合も発生します。

結論
PowerShellのSplit-Path
コマンドレットは、システム管理者やユーザーにとって不可欠なツールです。このチュートリアルの目的は、Split-Path
コマンドレットが与えられた任意のパスを分割し、使用するパラメータに基づいて特定の要素を返す方法を教えることでした。
Split-Path
を以前のタスクで使用したことがありますか?そうでない場合、このチュートリアルはマニュアルまたは自動化の仕事で使用する説得力がありましたか?または、PowerShellのSplit-Path
よりも優れた方法でパスを分割する方法をご存知ですか?