【问题标题】:How to get the Parent's parent directory in Powershell?如何在 Powershell 中获取 Parent 的父目录?
【发布时间】:2012-04-01 07:16:05
【问题描述】:

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

$scriptPath = (Get-ScriptDirectory);

现在我想找到目录两个父级。

我需要一个好的方法:

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

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

【问题讨论】:

    标签: powershell scripting


    【解决方案1】:

    目录的版本

    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。

    【讨论】:

    • 真棒@rerun,返回目录对象,然后返回字符串中的路径的命令是什么?
    • .parent 仅适用于目录对象。如果我有一个文件的路径,并且我想找到该文件所在目录的父目录,我需要使用(get-item $PathToFile ).Directory.parent
    • 请注意,这仅在 $scriptPath 存在时有效。否则只需使用Split-Path $scriptPath -parent
    • 我已提议将@Baodad 评论合并到您的答案中,以便 SO 的其他成员更容易看到它。
    【解决方案2】:

    我已经这样解决了:

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

    【讨论】:

    • $RootPath = Split-Path (Split-Path $PSScriptRoot) 也有效,因为-ParentSplit-Path 的默认位置拆分参数
    • 如果你不喜欢括号并且想从左到右阅读$RootPath = $PSScriptRoot | Split-Path | Split-Path,你也可以使用管道。
    【解决方案3】:

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

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

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

    获取整个路径:

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

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

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

    【讨论】:

      【解决方案4】:

      你可以使用

      (get-item $scriptPath).Directoryname
      

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

      (get-item $scriptPath).Directory
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          在 PowerShell 3 中,$PsScriptRoot 或关于两个父母的问题,

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

          【讨论】:

            【解决方案7】:
            Split-Path -Path (Get-Location).Path -Parent
            

            【讨论】:

              【解决方案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
              

              【讨论】:

                【解决方案9】:

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

                • 可以通过 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 别名。

                【讨论】:

                  【解决方案10】:

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

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

                  【讨论】:

                    【解决方案11】:

                    在 powershell 中:

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-03-05
                      • 1970-01-01
                      • 2016-05-18
                      • 1970-01-01
                      相关资源
                      最近更新 更多