¿Cómo obtener el directorio principal de los padres en Powershell?

96

Entonces, si tengo un directorio almacenado en una variable, diga:

$scriptPath = (Get-ScriptDirectory);

Ahora me gustaría encontrar el directorio dos niveles superiores.

Necesito una buena forma de hacer:

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

¿Puedo acceder a rootPath en una línea de código?

Mark Kadlec
fuente

Respuestas:

163

Versión para un directorio

get-item es su amigable mano amiga aquí.

(get-item $scriptPath ).parent.parent

Si solo quieres la cuerda

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

Versión de un archivo

Si $scriptPathapunta a un archivo Directory, primero debe llamar a la propiedad, por lo que la llamada se vería así

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

Observaciones
Esto solo funcionará si $scriptPathexiste. De lo contrario, debe usar Split-Pathcmdlet.

repetición
fuente
Awesome @rerun, que devuelve el objeto de directorio, ¿cuál es el comando para luego devolver la ruta en una cadena?
Mark Kadlec
12
.parentsolo funciona en objetos de directorio. Si tengo una ruta a un archivo y quiero encontrar el padre del directorio en el que se encuentra el archivo, necesito usarlo(get-item $PathToFile ).Directory.parent
Baodad
6
Tenga en cuenta que esto funciona solo cuando $scriptPathexiste. De lo contrario, solo use Split-Path $scriptPath -parent.
orad
2
He propuesto una combinación del comentario de @Baodad en su respuesta para que sea más visible para otros miembros de SO.
SOReader
34

Lo he resuelto así:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
Matthias König
fuente
$RootPath = Split-Path (Split-Path $PSScriptRoot)también funciona ya que -Parentes el parámetro de división de ubicación predeterminado paraSplit-Path
jarrad_obrien
22

Puede dividirlo en las barras invertidas y tomar el penúltimo con indexación de matriz negativa para obtener solo el nombre del directorio de abuelos.

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

Tienes que doblar la barra invertida para escapar en la expresión regular.

Para obtener el camino completo:

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

Y, al observar los parámetros de ruta dividida, toma la ruta como entrada de canalización, por lo que:

$rootpath = $scriptpath | split-path -parent | split-path -parent
mjolinor
fuente
Debería haber comprobado esos parámetros primero.
mjolinor
12

Puedes usar

(get-item $scriptPath).Directoryname

para obtener la ruta de la cadena o si desea el tipo de directorio, use:

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

En PowerShell 3, $PsScriptRooto para su pregunta de dos padres,

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

Simplemente puede encadenar tantos split-pathcomo necesite:

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

Para extrapolar un poco las otras respuestas (de la manera más amigable para los principiantes):

  • Los objetos de cadena que apuntan a rutas válidas se pueden convertir en objetos DirectoryInfo / FileInfo mediante funciones como Get-Item y Get-ChildItem.
  • .Parent solo se puede utilizar en un objeto DirectoryInfo.
  • .Directory convierte el objeto FileInfo en un objeto DirectoryInfo y devolverá un valor nulo si se usa en cualquier otro tipo (incluso otro objeto DirectoryInfo).
  • .DirectoryName convierte un objeto FileInfo en un objeto String y devolverá un valor nulo si se usa en cualquier otro tipo (incluso otro objeto String).
  • .FullName convierte un objeto DirectoryInfo / FileInfo en un objeto String y devolverá un valor nulo si se usa en cualquier otro tipo (incluso otro objeto DirectoryInfo / FileInfo).

Verifique el tipo de objeto con el método GetType para ver con qué está trabajando: $scriptPath.GetType()

Por último, un consejo rápido que ayuda a hacer gifrases ingeniosas : Get-Item tiene el alias y Get-ChildItem tiene el gcialias.

Vopel
fuente
0

Si desea utilizar $ PSScriptRoot, puede hacerlo

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

En powershell:

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

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