Як отримати батьківський каталог батьків у Powershell?


95

Отже, якщо у мене є каталог, що зберігається у змінній, скажіть:

$scriptPath = (Get-ScriptDirectory);

Тепер я хотів би знайти каталог на два батьківські рівні вище.

Мені потрібен хороший спосіб зробити:

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

Чи можу я дістатися до rootPath в одному рядку коду?

Відповіді:


162

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

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

12
.parentпрацює лише з об'єктами каталогів. Якщо у мене є шлях до файлу, і я хочу знайти батьківський каталог, у якому знаходиться файл, мені потрібно використовувати(get-item $PathToFile ).Directory.parent
Baodad

6
Зверніть увагу, що це працює лише тоді, коли $scriptPathіснує. В іншому випадку просто використовуйте Split-Path $scriptPath -parent.
орад

2
Я запропонував об’єднати коментар @Baodad у вашу відповідь, щоб він був більш помітним для інших членів SO.
SOReader

34

Я вирішив це так:

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

$RootPath = Split-Path (Split-Path $PSScriptRoot)також працює, оскільки -Parentє типовим параметром розділення місцеположення дляSplit-Path
jarrad_obrien

21

Ви можете розділити його на зворотних скісних рисках і взяти наступний із негативним індексуванням масиву, щоб отримати лише ім'я каталогу бабусь і дідусів.

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

Вам потрібно подвоїти зворотну скісну риску, щоб уникнути її в регулярному виразі.

Щоб отримати весь шлях:

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

І, дивлячись на параметри розділеного шляху, він приймає шлях як вхід конвеєра, тому:

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

Слід спочатку перевірити ці параметри.
мьолінор

12

Можна використовувати

(get-item $scriptPath).Directoryname

щоб отримати шлях до рядка або якщо ви хочете використовувати тип каталогу:

(get-item $scriptPath).Directory

5

У PowerShell 3 $PsScriptRootабо для вашого запитання про двох батьків,

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

5

Ви можете просто прив’язати стільки, split-pathскільки вам потрібно:

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


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.