Powershellで親の親ディレクトリを取得する方法?


94

したがって、変数にディレクトリが格納されている場合は、次のように言います。

$scriptPath = (Get-ScriptDirectory);

次に、2つ上のレベルのディレクトリを見つけたいと思います。

私は良い方法が必要です:

$parentPath = Split-Path -parent $scriptPath
$rootPath = Split-Path -parent $parentPath

1行のコードでrootPathにアクセスできますか?

回答:


158

ディレクトリのバージョン

get-item ここはあなたのフレンドリーな救いの手です。

(get-item $scriptPath ).parent.parent

文字列のみが必要な場合

(get-item $scriptPath ).parent.parent.FullName

ファイルのバージョン

$scriptPathがファイルを指している場合Directory、最初にファイルのプロパティを呼び出す必要があるため、呼び出しは次のようになります。

(get-item $scriptPath).Directory.Parent.Parent.FullName

備考
これは$scriptPath存在する場合にのみ機能します。それ以外の場合は、Split-Pathコマンドレットを使用する必要があります。


ディレクトリオブジェクトを返す素晴らしい@rerun、パスを文字列で返すコマンドは何ですか?
Mark Kadlec、2012年

12
.parentディレクトリオブジェクトでのみ機能します。ファイルへのパスがあり、ファイルが存在するディレクトリの親を見つけたい場合は、使用する必要があります(get-item $PathToFile ).Directory.parent
Baodad

6
これ$scriptPathが存在する場合にのみ機能することに注意してください。それ以外の場合は、を使用してくださいSplit-Path $scriptPath -parent
orad

1
私はあなたの回答に@Baodadコメントをマージすることを提案しました。
SOReader 2016


21

それをバックスラッシュで分割し、最後から2番目の配列を負の配列インデックスで取得して、祖父母のディレクトリ名だけを取得できます。

($scriptpath -split '\\')[-2]

正規表現でエスケープするには、バックスラッシュを2倍にする必要があります。

パス全体を取得するには:

($path -split '\\')[0..(($path -split '\\').count -2)] -join '\'

そして、split-pathのパラメーターを見ると、それはパスをパイプライン入力として受け取るので、

$rootpath = $scriptpath | split-path -parent | split-path -parent

最初にこれらのパラメーターをチェックする必要があります。
mjolinor

12

使用できます

(get-item $scriptPath).Directoryname

文字列パスを取得する場合、またはディレクトリタイプを使用する場合:

(get-item $scriptPath).Directory


5

split-path必要な数だけチェーンすることができます。

$rootPath = $scriptPath | split-path | split-path


2

他の答えを少し外挿するには(可能な限り初心者にやさしい方法で):

  • 有効なパスを指す文字列オブジェクトは、Get-ItemやGet-ChildItemなどの関数を介してDirectoryInfo / FileInfoオブジェクトに変換できます。
  • .ParentはDirectoryInfoオブジェクトでのみ使用できます。
  • .DirectoryはFileInfoオブジェクトをDirectoryInfoオブジェクトに変換し、他のタイプ(別のDirectoryInfoオブジェクトを含む)で使用された場合はnullを返します。
  • .DirectoryNameはFileInfoオブジェクトをStringオブジェクトに変換し、他のタイプ(別のStringオブジェクトであっても)で使用された場合はnullを返します。
  • .FullNameはDirectoryInfo / FileInfoオブジェクトをStringオブジェクトに変換し、他のタイプ(別のDirectoryInfo / FileInfoオブジェクトを含む)で使用された場合はnullを返します。

GetTypeメソッドを使用してオブジェクトタイプを確認し、使用しているものを確認します。 $scriptPath.GetType()

最後に、ワンライナーの作成に役立つ簡単なヒント:Get-Itemにはgiエイリアスがあり、Get-ChildItemにはgciエイリアスがあります。


0

$ PSScriptRootを使用する場合は、次のことができます

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve

0

PowerShellで:

$this_script_path = $(Get-Item $($MyInvocation.MyCommand.Path)).DirectoryName

$parent_folder = Split-Path $this_script_path -Leaf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.