Comment obtenir le répertoire parent du parent dans Powershell?


94

Donc, si j'ai un répertoire stocké dans une variable, dites:

$scriptPath = (Get-ScriptDirectory);

Maintenant, je voudrais trouver le répertoire à deux niveaux parent.

J'ai besoin d'une belle façon de faire:

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

Puis-je accéder au rootPath en une seule ligne de code?

Réponses:


158

Version pour un annuaire

get-item est votre aide amicale ici.

(get-item $scriptPath ).parent.parent

Si vous voulez la chaîne uniquement

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

Version pour un fichier

Si $scriptPathpointe vers un fichier, vous devez d'abord appeler la Directorypropriété dessus, de sorte que l'appel ressemblerait à ceci

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

Remarques
Cela ne fonctionnera que s'il $scriptPathexiste. Sinon, vous devez utiliser l' Split-Pathapplet de commande.


Génial @rerun, qui retourne l'objet de répertoire, quelle est la commande pour ensuite retourner le chemin dans une chaîne?
Mark Kadlec

12
.parentne fonctionne que sur les objets d'annuaire. Si j'ai un chemin vers un fichier et que je veux trouver le parent du répertoire dans lequel se trouve le fichier, je dois utiliser(get-item $PathToFile ).Directory.parent
Baodad

6
Notez que cela ne fonctionne que lorsqu'il $scriptPathexiste. Sinon, utilisez simplement Split-Path $scriptPath -parent.
orad

1
J'ai proposé une fusion du commentaire @Baodad dans votre réponse afin qu'il soit plus visible pour les autres membres de SO.
SOReader

34

J'ai résolu ça comme ça:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent

$RootPath = Split-Path (Split-Path $PSScriptRoot)fonctionne également car -Parentest le paramètre de partage d'emplacement par défaut pourSplit-Path
jarrad_obrien

21

Vous pouvez le diviser au niveau des barres obliques inverses et prendre l'avant-dernier avec une indexation de tableau négative pour obtenir uniquement le nom du répertoire des grands-parents.

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

Vous devez doubler la barre oblique inverse pour l'échapper dans l'expression rationnelle.

Pour obtenir le chemin complet:

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

Et, en regardant les paramètres de split-path, il prend le chemin comme entrée de pipeline, donc:

$rootpath = $scriptpath | split-path -parent | split-path -parent

J'aurais dû vérifier ces paramètres en premier.
mjolinor

12

Vous pouvez utiliser

(get-item $scriptPath).Directoryname

pour obtenir le chemin de la chaîne ou si vous souhaitez utiliser le type de répertoire:

(get-item $scriptPath).Directory

5

Dans PowerShell 3, $PsScriptRootou pour votre question de deux parents,

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

5

Vous pouvez simplement en chaîner autant split-pathque vous le souhaitez:

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


2

Pour extrapoler un peu les autres réponses (de la manière la plus conviviale possible pour les débutants):

  • Les objets chaîne qui pointent vers des chemins valides peuvent être convertis en objets DirectoryInfo / FileInfo via des fonctions telles que Get-Item et Get-ChildItem.
  • .Parent ne peut être utilisé que sur un objet DirectoryInfo.
  • .Directory convertit l'objet FileInfo en objet DirectoryInfo et retournera null s'il est utilisé sur tout autre type (même un autre objet DirectoryInfo).
  • .DirectoryName convertit un objet FileInfo en objet String et retournera null s'il est utilisé sur tout autre type (même un autre objet String).
  • .FullName convertit un objet DirectoryInfo / FileInfo en objet String et retournera null s'il est utilisé sur tout autre type (même un autre objet DirectoryInfo / FileInfo).

Vérifiez le type d'objet avec la méthode GetType pour voir avec quoi vous travaillez: $scriptPath.GetType()

Enfin, une astuce rapide qui aide à créer des one-liners: Get-Item a l' gialias et Get-ChildItem a l' gcialias.


0

Si vous souhaitez utiliser $ PSScriptRoot, vous pouvez faire

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

0

Dans PowerShell:

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

$parent_folder = Split-Path $this_script_path -Leaf
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.