Como obter o diretório pai do pai no Powershell?

94

Portanto, se eu tiver um diretório armazenado em uma variável, diga:

$scriptPath = (Get-ScriptDirectory);

Agora eu gostaria de encontrar o diretório dois níveis pai acima.

Eu preciso de uma boa maneira de fazer:

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

Posso chegar ao rootPath em uma linha de código?

Mark Kadlec
fonte

Respostas:

158

Versão para um diretório

get-item é a sua mão amiga aqui.

(get-item $scriptPath ).parent.parent

Se você quiser apenas a corda

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

Versão para um arquivo

Se $scriptPathapontar para um arquivo, você deve chamar a Directorypropriedade nele primeiro, então a chamada ficaria assim

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

Observações
Isso só funcionará se $scriptPathexistir. Caso contrário, você terá que usar o Split-Pathcmdlet.

repetir
fonte
Impressionante @rerun, que retorna o objeto do diretório, qual é o comando para então retornar o caminho em uma string?
Mark Kadlec
12
.parentsó funciona em objetos de diretório. Se eu tiver um caminho para um arquivo e quiser encontrar o pai do diretório em que o arquivo está, preciso usar(get-item $PathToFile ).Directory.parent
Baodad
6
Observe que isso funciona apenas quando $scriptPathexiste. Caso contrário, basta usar Split-Path $scriptPath -parent.
orad
1
Propus mesclar o comentário de @Baodad em sua resposta para que fique mais visível para outros membros do SO.
SOReader
34

Eu resolvi isso assim:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
Matthias König
fonte
$RootPath = Split-Path (Split-Path $PSScriptRoot)também funciona, pois -Parenté o parâmetro de divisão de local padrão paraSplit-Path
jarrad_obrien
21

Você pode dividi-lo nas barras invertidas e pegar o penúltimo com indexação de array negativa para obter apenas o nome do diretório dos avós.

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

Você precisa dobrar a barra invertida para escapar dela na regex.

Para obter o caminho completo:

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

E, observando os parâmetros do caminho dividido, ele usa o caminho como entrada do pipeline, então:

$rootpath = $scriptpath | split-path -parent | split-path -parent
mjolinor
fonte
Deveria ter verificado esses parâmetros primeiro.
mjolinor
12

Você pode usar

(get-item $scriptPath).Directoryname

para obter o caminho da string ou se desejar o tipo de diretório, use:

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

No PowerShell 3, $PsScriptRootou para sua pergunta de dois pais,

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

Você pode simplesmente encadear quantos split-pathprecisar:

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

Para extrapolar um pouco as outras respostas (da forma mais amigável possível para iniciantes):

  • Objetos String que apontam para caminhos válidos podem ser convertidos em objetos DirectoryInfo / FileInfo por meio de funções como Get-Item e Get-ChildItem.
  • .Parent só pode ser usado em um objeto DirectoryInfo.
  • .Directory converte o objeto FileInfo em um objeto DirectoryInfo e retornará null se usado em qualquer outro tipo (até mesmo outro objeto DirectoryInfo).
  • .DirectoryName converte um objeto FileInfo em um objeto String e retornará null se usado em qualquer outro tipo (até mesmo outro objeto String).
  • .FullName converte um objeto DirectoryInfo / FileInfo em um objeto String e retornará null se usado em qualquer outro tipo (até mesmo outro objeto DirectoryInfo / FileInfo).

Verifique o tipo de objeto com o método GetType para ver com o que você está trabalhando: $scriptPath.GetType()

Por último, uma dica rápida que ajuda a criar frases simples: Get-Item tem o gialias e Get-ChildItem o gcialias.

Vopel
fonte
0

Se você quiser usar $ PSScriptRoot, você pode fazer

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

No PowerShell:

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

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