¿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?

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.


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

$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

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

5

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

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

5

Simplemente puede encadenar tantos split-pathcomo necesite:

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


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.


0

Si desea utilizar $ PSScriptRoot, puede hacerlo

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

0

En powershell:

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

$parent_folder = Split-Path $this_script_path -Leaf
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.