Как получить родительский каталог в Powershell?


Так что если у меня есть каталог, хранящийся в переменной, скажем:

$scriptPath = (Get-ScriptDirectory);

теперь я хотел бы найти каталог два родитель уровней вверх.

мне нужен хороший способ:

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

могу ли я добраться до rootPath в одной строке кода?

9 65

9 ответов:

версия для каталога

get-item Это ваша дружеская рука помощи здесь.

(get-item $scriptPath ).parent.parent

если вы хотите только строку

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

версия для файла

если $scriptPath указывает на файл, то вы должны называть Directory свойство на нем во-первых, так что вызов будет выглядеть так

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

Примечания
Это будет работать только если $scriptPath существует. В противном случае вы должны использовать .

Я решил это так:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent

вы можете разделить его на обратные косые черты и взять предпоследний с отрицательным индексированием массива, чтобы получить только имя каталога grandparent.

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

вы должны удвоить обратную косую черту, чтобы избежать его в регулярном выражении.

чтобы получить полный путь:

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

и, глядя на параметры для split-path, он принимает путь в качестве входного сигнала конвейера, поэтому:

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

можно использовать

(get-item $scriptPath).Directoryname

чтобы получить путь к строке или если вы хотите использовать тип каталога:

(get-item $scriptPath).Directory

В PowerShell 3, $PsScriptRoot или на ваш вопрос о двух родителях,

$dir = ls "$PsScriptRoot\..\.."

Вы можете просто цепь, как много split-path что нужно:

$rootPath = $scriptPath | split-path | split-path
Split-Path -Path (Get-Location).Path -Parent

Если вы хотите использовать $PSScriptRoot, вы можете сделать

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

в powershell:

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

$parent_folder = Split-Path $this_script_path -Leaf