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?

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.


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

$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

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

5

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

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

5

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

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


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.


0

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

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

0

W PowerShell:

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

$parent_folder = Split-Path $this_script_path -Leaf
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.