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