PowerShell Split-Path Cmdletを使用してパスを分割する方法

あなたが求めるのはパスを分割して特定の部分を取得することですか?その場合、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パラメータを追加します。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Parent

以下の結果は、コマンドが親フォルダのパスを返すことを示しています。

Returning the parent containers of the Item

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パラメータとともに実行します。このコマンドはパスを分割し、結果からドライブレターを省略します。

Split-Path -Path C:\demo\subfolder1 -NoQualifier

以下の結果からわかるように、noQualifierパラメータを使用すると、修飾子のないパスが返されます。

Returning the Path Without the Qualifier

パスのドライブまたは修飾子の取得

修飾子またはドライブレターのみを返す必要がある場合があります。たとえば、スクリプトでドライブレターに基づいて結果を集計したい場合です。

そのためには、以下のPowerShellのSplit-Pathコマンドを-Qualifierパラメータとともに実行します。このコマンドはパスを分割し、結果として修飾子の文字列のみを返します。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Qualifier
Returning the Path’s Drive or Qualifier

ファイル、ディレクトリ、またはアイテムの名前の表示

パスを木と考えてみてください。修飾子はその木自体であり、フォルダは枝であり、最後には葉があります。葉はパスの末尾にあるゼロでない文字列です。

パスを分割して葉を取得する必要がある場合は、以下のSplit-Pathコマンドを実行し、-Leafパラメータを追加します。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Leaf

結果として、以下のイメージは、指定したパスからファイル名のみが返されたことを示しています。

Returning the Path’s Leaf

ファイル名と拡張子の分割(≥PowerShell 6.0)

注意: このセクションはPowerShell 6.0以降に適用されます。

したがって、パスを分割し、アイテムを返しました。 そして、この場合、アイテムはファイル名(TestFile_11.txt)であり、これにはベースと拡張子の2つの部分があります。 PowerShell Split-Pathコマンドレットを使用して、-LeafBaseおよび-Extensionパラメータを使用してリーフをこれらの2つの部分にさらに分割できます。

ファイル名のベースと拡張子を取得するには、以下のコマンドを実行してください。

パスに拡張子がない場合、Extensionパラメータは空の文字列を返します。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -LeafBase
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Extension
Splitting the Leaf’s Base and 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で以下のコマンドを実行してください。

# パス ('C:\demo\subfolder1\TestFile_11.txt') を '\' で区切ってください。
# 区切り後の最後の要素 '[-1]' を選択します(TestFile_11.txt)
# このパターンに一致する文字列を検索してください --> '\.[^.]*$'
# ^ このパターンはパス内の最後のドット "." とそれに続くすべての文字と一致します。
# その一致を何もない/空の値で置き換えます。
('C:\demo\subfolder1\TestFile_11.txt').split('\')[-1] -replace '\.[^.]*$',''

その結果、以下のスクリーンショットはコマンドがファイル名のベースのみを返したことを示しています。

Getting the file base in PowerShell 5.1

今度は、ファイル拡張子のみを取得するには、PowerShellで以下のコマンドを実行してください。

# パス ('C:\demo\subfolder1\TestFile_11.txt') を '.' で区切ってください。
# 区切り後の最後の要素 '[-1]' を選択します(txt)
('C:\demo\subfolder1\TestFile_11.txt').split('.')[-1]

以下の結果は、コマンドがファイルの拡張子のみを返したことを示しています – txt

Getting the file extension in PowerShell ≤ 5.1

パスが絶対かどうかを判断する

システム管理者として、2つのパスタイプに遭遇します—絶対相対。しかし、違いは何でしょうか?絶対パスは C:\demoHKCU:\Software などの修飾子で始まります。対照的に、相対パスには修飾子がなく、.\demo\folder1\folder2のようなものです。

PowerShellのSplit-Pathコマンドレットは、-IsAbsoluteパラメータを使用して絶対パスを特定するのに役立ちます。パスが絶対かどうかを判断するには、以下のコマンドを実行します。

# このパスは絶対です
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -IsAbsolute
# このパスは相対です
Split-Path -Path .\demo\subfolder1\TestFile_11.txt -IsAbsolute

下記のように、-isAbsoluteパラメータはパスが絶対か相対かを示すブール値を返します(TRUEまたはFALSE)。

Determining if the Path is Absolute

ワイルドカードを使用したパスの分割と解決

Split-Pathコマンドレットで分割するパスは、存在する必要はありません。パスが存在しているかどうかにかかわらず、このコマンドレットはそれを分割して結果を返します。

しかし、PowerShellのSplit-Pathコマンドレットには、-Resolveという別のパラメータがあります。このパラメータを使用すると、ワイルドカードで参照されるアイテムを解決できます。このパラメータを使用する場合、分割するパスとその内部のアイテムはすでに存在している必要があります。

たとえば、*.txtファイル拡張子に一致するアイテムを返すには、以下のコマンドを実行します。 -Leafパラメータを使用すると、コマンドレットが親コンテナーではなくアイテムのみを返します。

*)ワイルドカードは一致する1文字以上を表し、(?)は1文字のワイルドカードを表します。

Split-Path -Path C:\demo\subfolder1\*.txt -Leaf -Resolve

以下の結果は、TestFile_11.txtからTestFile_20.txtまでのファイルがリストされています。これらのファイルはすべて.txt拡張子と一致します。

Resolving matching filenames

単一文字の一致を解決するには、アスタリスク(*)ワイルドカードを(?)ワイルドカードで置き換えると、以下のコマンドのようになります。

Split-Path -Path C:\demo\subfolder1\TestFile_2?.txt -Resolve -Leaf

以下の出力は、このファイルが唯一一致するものであるため、ファイルTestFile_20.txtのみを表示します。

Resolving matching single character

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

Split-Path -Path 'C:\demo\subfolder1\dir`n\TestFile_2?.txt' -Leaf -Resolve
Splitting and Resolving a Path with Escape Characters

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

Split-Path -Path C:\demo\subfolder1\dir`n\TestFile_2?.txt -Leaf -Resolve
Split-Path -Path "C:\demo\subfolder1\dir`n\TestFile_2?.txt" -Leaf -Resolve
Resolving a Path without enclosing single quotation marks

結論

PowerShellのSplit-Pathコマンドレットは、システム管理者やユーザーにとって不可欠なツールです。このチュートリアルの目的は、Split-Pathコマンドレットが与えられた任意のパスを分割し、使用するパラメータに基づいて特定の要素を返す方法を教えることでした。

Split-Pathを以前のタスクで使用したことがありますか?そうでない場合、このチュートリアルはマニュアルまたは自動化の仕事で使用する説得力がありましたか?または、PowerShellのSplit-Pathよりも優れた方法でパスを分割する方法をご存知ですか?

Source:
https://adamtheautomator.com/powershell-split-path/