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?

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.


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

$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

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

5

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

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

5

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

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


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.


0

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

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

0

In Powershell:

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

$parent_folder = Split-Path $this_script_path -Leaf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.