如何在Powershell中获取Parent的父目录?

问题描述 投票:0回答:12

所以如果我有一个目录存储在一个变量中,说:

$scriptPath = (Get-ScriptDirectory);

现在我想找到目录 two parent levels up.

我需要一个好的方法:

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

我可以在一行代码中到达 rootPath 吗?

powershell path scripting
12个回答
219
投票

目录版本

get-item
是您友好的帮手。

(get-item $scriptPath ).parent.parent

如果你只想要字符串

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

文件的版本

如果

$scriptPath
指向一个文件,那么你必须先调用它的
Directory
属性,所以调用看起来像这样

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

备注
这仅在

$scriptPath
存在时才有效。否则,您必须使用
Split-Path
cmdlet。


47
投票

我已经这样解决了:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent

23
投票

您可以在反斜杠处拆分它,并使用倒数第二个具有负数组索引的目录来获取祖父目录名称。

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

你必须加倍反斜杠才能在正则表达式中转义它。

获取整个路径:

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

并且,查看 split-path 的参数,它将路径作为管道输入,所以:

$rootpath = $scriptpath | split-path -parent | split-path -parent

14
投票

你可以使用

(get-item $scriptPath).Directoryname

获取字符串路径或者如果你想要目录类型使用:

(get-item $scriptPath).Directory

13
投票

您可以根据需要简单地链接任意数量的

split-path

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

8
投票

最简单的解决方案

这是最简单的解决方案

"$path\..\.."

如果想获取绝对路径,可以

"$path\..\.." | Convert-Path

可重复使用的解决方案

这里有一个可重用的解决方案,先定义getParent函数,然后直接调用。

function getParent($path, [int]$deep = 1) {
    $result = $path | Get-Item | ForEach-Object { $_.PSIsContainer ? $_.Parent : $_.Directory }
    for ($deep--; $deep -gt 0; $deep--) { $result = getParent $result }
    return $result
}
getParent $scriptPath 2

5
投票

在 PowerShell 3 中,

$PsScriptRoot
或者对于你的两个父母的问题,

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

5
投票
Split-Path -Path (Get-Location).Path -Parent

5
投票

对其他答案进行一些推断(以尽可能对初学者友好的方式):

  • 指向有效路径的字符串对象可以通过 Get-Item 和 Get-ChildItem 等函数转换为 DirectoryInfo/FileInfo 对象。
  • .Parent 只能用于 DirectoryInfo 对象。
  • .Directory 将 FileInfo 对象转换为 DirectoryInfo 对象(针对文件的目录),如果用于任何其他类型 (甚至另一个 DirectoryInfo 对象)将返回 null.
  • .DirectoryName 将 FileInfo 对象转换为 String 对象(针对文件的目录),如果用于任何其他类型 (甚至另一个 String 对象)将返回 null.
  • .FullName 将 DirectoryInfo/FileInfo 对象转换为 String 对象,如果用于任何其他类型 (甚至另一个 DirectoryInfo/FileInfo 对象)将返回 null.
  • .Path 将 PathInfo 对象转换为 String 对象,如果用于任何其他类型 (甚至是另一个 PathInfo 对象)将返回 null.

使用 GetType 方法检查对象类型以查看您正在使用的内容:

$scriptPath.GetType()

最后,一个有助于制作单行代码的快速提示:Get-Item 有

gi
别名,Get-ChildItem 有
gci
别名。


0
投票

如果你想使用 $PSScriptRoot 你可以这样做

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

0
投票

在Powershell中:

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

$parent_folder = Split-Path $this_script_path -Leaf

0
投票

类型为

FileInfo
DirectoryInfo
String
时对应的处理方法如下:

例子

function Get-ParentPath {
    param (
        [Parameter(Mandatory=$true)]
        [object]$myPath
    )
    switch ($myPath.GetType().Name) {
        "FileInfo" { echo "FileInfo: $($myPath.DirectoryName)" } # path must exist Otherwise will get the error
        "DirectoryInfo" { echo "DirectoryInfo: $($myPath.Parent.FullName)" } # path must exist Otherwise will get the error
        "String" { $myPath | Split-Path } # it's ok when the path does not exist
        default { Write-Host "Unknown type" }
    }
}

# test
Get-ParentPath (Get-Item "C:\Windows\System32\cmd.exe")
Get-ParentPath (Get-Item "C:\Windows\System32")
Get-ParentPath ("C:\bar\foo\notExistsDir")
Get-ParentPath ("C:\bar\foo\notExistsDir\abc.txt")

输出:

FileInfo: C:\Windows\System32
DirectoryInfo: C:\Windows
C:\bar\foo
C:\bar\foo\notExistsDir
© www.soinside.com 2019 - 2024. All rights reserved.