Wie erhalte ich das übergeordnete Verzeichnis der Eltern in Powershell?

94

Wenn ich also ein Verzeichnis in einer Variablen gespeichert habe, sagen Sie:

$scriptPath = (Get-ScriptDirectory);

Jetzt möchte ich das Verzeichnis zwei übergeordnete Ebenen höher finden.

Ich brauche eine nette Art zu tun:

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

Kann ich in einer Codezeile zum rootPath gelangen?

Mark Kadlec
quelle

Antworten:

158

Version für ein Verzeichnis

get-item ist deine freundliche helfende Hand hier.

(get-item $scriptPath ).parent.parent

Wenn Sie nur die Zeichenfolge möchten

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

Version für eine Datei

Wenn Sie $scriptPathauf eine Datei verweisen, müssen DirectorySie zuerst die Eigenschaft aufrufen , damit der Aufruf so aussieht

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

Hinweise
Dies funktioniert nur, wenn $scriptPathvorhanden. Andernfalls müssen Sie das Split-PathCmdlet verwenden.

Wiederholung
quelle
Awesome @rerun, das das Verzeichnisobjekt zurückgibt. Wie lautet der Befehl, um dann den Pfad in einer Zeichenfolge zurückzugeben?
Mark Kadlec
12
.parentfunktioniert nur bei Verzeichnisobjekten. Wenn ich einen Pfad zu einer Datei habe und das übergeordnete Verzeichnis des Verzeichnisses finden möchte, in dem sich die Datei befindet, muss ich(get-item $PathToFile ).Directory.parent
Baodad
6
Beachten Sie, dass dies nur funktioniert, wenn es $scriptPathexistiert. Ansonsten einfach benutzen Split-Path $scriptPath -parent.
Orad
1
Ich habe eine Zusammenführung von @ Baodad-Kommentaren in Ihrer Antwort vorgeschlagen, damit diese für andere SO-Mitglieder besser sichtbar sind.
SOReader
34

Ich habe das so gelöst:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
Matthias König
quelle
$RootPath = Split-Path (Split-Path $PSScriptRoot)funktioniert auch, da -Parentder Standardparameter für die Standortaufteilung fürSplit-Path
jarrad_obrien
21

Sie können es an den Backslashes aufteilen und das vorletzte mit negativer Array-Indizierung verwenden, um nur den Verzeichnisnamen der Großeltern zu erhalten.

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

Sie müssen den Backslash verdoppeln, um ihn im regulären Ausdruck zu umgehen.

So erhalten Sie den gesamten Pfad:

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

Wenn Sie sich die Parameter für den geteilten Pfad ansehen, wird der Pfad als Pipeline-Eingabe verwendet.

$rootpath = $scriptpath | split-path -parent | split-path -parent
mjolinor
quelle
Sollte diese Parameter zuerst überprüft haben.
Mjolinor
12

Sie können verwenden

(get-item $scriptPath).Directoryname

Um den Zeichenfolgenpfad abzurufen oder den Verzeichnistyp zu verwenden, verwenden Sie:

(get-item $scriptPath).Directory
mithun_daa
quelle
5

In PowerShell 3 $PsScriptRootoder für Ihre Frage nach zwei Elternteilen

$dir = ls "$PsScriptRoot\..\.."
Jon Davis
quelle
5

Sie können einfach so viele verketten, split-pathwie Sie benötigen:

$rootPath = $scriptPath | split-path | split-path
wisbucky
quelle
2
Split-Path -Path (Get-Location).Path -Parent
Emrah Saglam
quelle
2

Um die anderen Antworten ein wenig zu extrapolieren (so anfängerfreundlich wie möglich):

  • Zeichenfolgenobjekte, die auf gültige Pfade verweisen, können über Funktionen wie Get-Item und Get-ChildItem in DirectoryInfo / FileInfo-Objekte konvertiert werden.
  • .Parent kann nur für ein DirectoryInfo-Objekt verwendet werden.
  • .Directory konvertiert das FileInfo-Objekt in ein DirectoryInfo-Objekt und gibt null zurück, wenn es für einen anderen Typ (sogar ein anderes DirectoryInfo-Objekt) verwendet wird.
  • .DirectoryName konvertiert ein FileInfo-Objekt in ein String-Objekt und gibt null zurück, wenn es für einen anderen Typ (sogar ein anderes String-Objekt) verwendet wird.
  • .FullName konvertiert ein DirectoryInfo / FileInfo-Objekt in ein String-Objekt und gibt null zurück, wenn es für einen anderen Typ verwendet wird (sogar für ein anderes DirectoryInfo / FileInfo-Objekt).

Überprüfen Sie den Objekttyp mit der GetType-Methode, um festzustellen, mit was Sie arbeiten: $scriptPath.GetType()

Zum Schluss noch ein kurzer Tipp, der beim Erstellen von Einzeilern hilft: Get-Item hat den giAlias ​​und Get-ChildItem hat den gciAlias.

Vopel
quelle
0

Wenn Sie $ PSScriptRoot verwenden möchten, können Sie dies tun

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
dzolnjan
quelle
0

In Powershell:

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

$parent_folder = Split-Path $this_script_path -Leaf
6stem.com
quelle