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

96

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

$scriptPath = (Get-ScriptDirectory);

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

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

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

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

Марк Кадлец
источник

Ответы:

163

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

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, который возвращает объект каталога, какая команда затем возвращает путь в строке?
Марк Кадлец
12
.parentработает только с объектами каталога. Если у меня есть путь к файлу, и я хочу найти родительский каталог, в котором находится файл, мне нужно использовать(get-item $PathToFile ).Directory.parent
Баодад
6
Обратите внимание, что это работает, только если $scriptPathсуществует. В противном случае просто используйте Split-Path $scriptPath -parent.
orad
2
Я предложил добавить комментарий @Baodad в ваш ответ, чтобы он был более заметен другим членам SO.
SOReader
34

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

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
Маттиас Кениг
источник
$RootPath = Split-Path (Split-Path $PSScriptRoot)также работает, поскольку -Parentэто параметр разделения местоположения по умолчанию дляSplit-Path
jarrad_obrien
22

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

($scriptpath -split '\\')[-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
mithun_daa
источник
5

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

$dir = ls "$PsScriptRoot\..\.."
Джон Дэвис
источник
5

Вы можете просто связать столько split-path сколько вам нужно:

$rootPath = $scriptPath | split-path | split-path
Wisbucky
источник
2
Split-Path -Path (Get-Location).Path -Parent
Эмра Саглам
источник
2

Чтобы немного экстраполировать другие ответы (насколько это возможно для начинающих):

  • Строковые объекты, указывающие на допустимые пути, могут быть преобразованы в объекты DirectoryInfo / FileInfo с помощью таких функций, как Get-Item и Get-ChildItem.
  • .Parent может использоваться только для объекта DirectoryInfo.
  • .Directory преобразует объект FileInfo в объект DirectoryInfo и вернет значение null, если используется для любого другого типа (даже для другого объекта DirectoryInfo).
  • .DirectoryName преобразует объект FileInfo в объект String и вернет значение null, если используется для любого другого типа (даже для другого объекта String).
  • .FullName преобразует объект DirectoryInfo / FileInfo в объект String и вернет значение null, если используется с любым другим типом (даже с другим объектом DirectoryInfo / FileInfo).

Проверьте тип объекта с помощью метода 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
6stem.com
источник