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?

Mark Kadlec
la source

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.

rediffusion
la source
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
Matthias König
la source
$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
mjolinor
la source
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
mithun_daa
la source
5

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

$dir = ls "$PsScriptRoot\..\.."
Jon Davis
la source
5

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

$rootPath = $scriptPath | split-path | split-path
wisbucky
la source
2
Split-Path -Path (Get-Location).Path -Parent
Emrah Saglam
la source
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.

Vopel
la source
0

Si vous souhaitez utiliser $ PSScriptRoot, vous pouvez faire

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
Dzolnjan
la source
0

Dans PowerShell:

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

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