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?
powershell
scripting
Mark Kadlec
źródło
źródło
.parent
dział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
$scriptPath
, gdy istnieje. W przeciwnym razie po prostu użyjSplit-Path $scriptPath -parent
.Rozwiązałem to w ten sposób:
$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
źródło
$RootPath = Split-Path (Split-Path $PSScriptRoot)
działa również, ponieważ-Parent
jest domyślnym parametrem podziału lokalizacji dlaSplit-Path
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
źródło
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
źródło
W PowerShell 3
$PsScriptRoot
lub w przypadku pytania dwojga rodziców$dir = ls "$PsScriptRoot\..\.."
źródło
Możesz po prostu połączyć tyle,
split-path
ile potrzebujesz:$rootPath = $scriptPath | split-path | split-path
źródło
źródło
Aby ekstrapolować nieco inne odpowiedzi (w sposób jak najbardziej przyjazny dla początkujących):
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
gi
alias, a Get-ChildItem magci
alias.źródło
Jeśli chcesz użyć $ PSScriptRoot, możesz to zrobić
Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
źródło
W PowerShell:
$this_script_path = $(Get-Item $($MyInvocation.MyCommand.Path)).DirectoryName $parent_folder = Split-Path $this_script_path -Leaf
źródło