Jak uzyskać katalog nadrzędny rodzica w programie PowerShell?

95

Więc jeśli mam katalog zapisany w zmiennej, powiedz:

$scriptPath = (Get-ScriptDirectory);

Teraz chciałbym znaleźć katalog o dwa poziomy nadrzędne wyżej.

Potrzebuję fajnego sposobu:

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

Czy mogę dostać się do rootPath w jednej linii kodu?

Mark Kadlec
źródło

Odpowiedzi:

163

Wersja dla katalogu

get-item jest twoją przyjazną pomocną dłonią.

(get-item $scriptPath ).parent.parent

Jeśli chcesz tylko string

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

Wersja dla pliku

Jeśli $scriptPathwskazuje na plik, musisz najpierw wywołać Directoryna nim właściwość, aby wywołanie wyglądało tak

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

Uwagi
To zadziała tylko wtedy $scriptPath, gdy istnieje. W przeciwnym razie musisz użyć polecenia Split-Pathcmdlet.

ponowne odtworzenie
źródło
Niesamowite @rerun, które zwraca obiekt katalogu, jakie jest polecenie, aby następnie zwrócić ścieżkę w ciągu?
Mark Kadlec
12
.parentdziała tylko na obiektach katalogu. Jeśli mam ścieżkę do pliku i chcę znaleźć katalog nadrzędny katalogu, w którym znajduje się plik, muszę użyć(get-item $PathToFile ).Directory.parent
Baodad
6
Zauważ, że działa to tylko wtedy $scriptPath, gdy istnieje. W przeciwnym razie po prostu użyj Split-Path $scriptPath -parent.
orad
2
Zaproponowałem połączenie komentarza @Baodad z Twoją odpowiedzią, aby był bardziej widoczny dla innych członków SO.
SOReader
34

Rozwiązałem to w ten sposób:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
Matthias König
źródło
$RootPath = Split-Path (Split-Path $PSScriptRoot)działa również, ponieważ -Parentjest domyślnym parametrem podziału lokalizacji dlaSplit-Path
jarrad_obrien
21

Możesz podzielić go na odwrotne ukośniki i wybrać przedostatni z ujemnym indeksowaniem tablicy, aby uzyskać tylko nazwę katalogu dziadków.

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

Aby uciec w wyrażeniu regularnym, musisz podwoić ukośnik odwrotny.

Aby uzyskać całą ścieżkę:

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

Patrząc na parametry podzielonej ścieżki, przyjmuje ścieżkę jako dane wejściowe potoku, więc:

$rootpath = $scriptpath | split-path -parent | split-path -parent
mjolinor
źródło
Powinienem był najpierw sprawdzić te parametry.
mjolinor
12

Możesz użyć

(get-item $scriptPath).Directoryname

aby uzyskać ścieżkę do ciągu lub jeśli chcesz użyć typu katalogu:

(get-item $scriptPath).Directory
mithun_daa
źródło
5

W PowerShell 3 $PsScriptRootlub w przypadku pytania dwojga rodziców

$dir = ls "$PsScriptRoot\..\.."
Jon Davis
źródło
5

Możesz po prostu połączyć tyle, split-pathile potrzebujesz:

$rootPath = $scriptPath | split-path | split-path
wisbucky
źródło
2
Split-Path -Path (Get-Location).Path -Parent
Emrah Saglam
źródło
2

Aby ekstrapolować nieco inne odpowiedzi (w sposób jak najbardziej przyjazny dla początkujących):

  • Obiekty typu String, które wskazują prawidłowe ścieżki, można konwertować na obiekty DirectoryInfo / FileInfo za pomocą funkcji, takich jak Get-Item i Get-ChildItem.
  • .Parent może być używany tylko w obiekcie DirectoryInfo.
  • .Directory konwertuje obiekt FileInfo na obiekt DirectoryInfo i zwróci wartość null, jeśli zostanie użyty na jakimkolwiek innym typie (nawet innym obiekcie DirectoryInfo).
  • .DirectoryName konwertuje obiekt FileInfo na obiekt String i zwróci wartość null, jeśli zostanie użyty na jakimkolwiek innym typie (nawet innym obiekcie String).
  • .FullName konwertuje obiekt DirectoryInfo / FileInfo na obiekt String i zwróci wartość null, jeśli zostanie użyty na dowolnym innym typie (nawet innym obiekcie DirectoryInfo / FileInfo).

Sprawdź typ obiektu za pomocą metody GetType, aby zobaczyć, z czym pracujesz: $scriptPath.GetType()

Na koniec krótka wskazówka, która pomaga w tworzeniu jednowierszowych: Get-Item ma gialias, a Get-ChildItem ma gcialias.

Vopel
źródło
0

Jeśli chcesz użyć $ PSScriptRoot, możesz to zrobić

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
dzolnjan
źródło
0

W PowerShell:

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

$parent_folder = Split-Path $this_script_path -Leaf
6stem.com
źródło