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

Mar*_*lec 76 powershell scripting

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

$scriptPath = (Get-ScriptDirectory);
Run Code Online (Sandbox Code Playgroud)

现在我想找到两个父级别的目录.

我需要一个很好的做法:

$parentPath = Split-Path -parent $scriptPath
$rootPath = Split-Path -parent $parentPath
Run Code Online (Sandbox Code Playgroud)

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

rer*_*run 135

目录的版本

get-item 这是你友好的帮助.

(get-item $scriptPath ).parent.parent
Run Code Online (Sandbox Code Playgroud)

如果你只想要字符串

(get-item $scriptPath ).parent.parent.FullName
Run Code Online (Sandbox Code Playgroud)

文件版本

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

(get-item $scriptPath).Directory.Parent.Parent.FullName
Run Code Online (Sandbox Code Playgroud)

备注
仅在$scriptPath存在时才有效.否则,您必须使用Split-Pathcmdlet.

  • `.parent`仅适用于目录对象.如果我有一个文件的路径,并且我想找到该文件所在目录的父目录,我需要使用`(get-item $ PathToFile).Directory.parent` (11认同)
  • 请注意,这仅在存在`$ scriptPath`时才有效.否则只需使用`Split-Path $ scriptPath -parent`. (6认同)
  • 我已提议将@Baodad 评论合并到您的答案中,以便 SO 的其他成员更能看到它。 (2认同)

小智 30

我已经解决了这个问题:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
Run Code Online (Sandbox Code Playgroud)

  • `$RootPath = Split-Path (Split-Path $PSScriptRoot)` 也有效,因为 `-Parent` 是 `Split-Path` 的默认位置分割参数 (2认同)

mjo*_*nor 18

您可以在反斜杠中将其拆分,并使用负数组索引进行倒数第二个以获取祖父目录名称.

($scriptpath -split '\\')[-2]
Run Code Online (Sandbox Code Playgroud)

你必须加倍反斜杠才能在正则表达式中将其转义.

要获得整个路径:

($path -split '\\')[0..(($path -split '\\').count -2)] -join '\'
Run Code Online (Sandbox Code Playgroud)

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

$rootpath = $scriptpath | split-path -parent | split-path -parent
Run Code Online (Sandbox Code Playgroud)


mit*_*daa 11

您可以使用

(get-item $scriptPath).Directoryname
Run Code Online (Sandbox Code Playgroud)

获取字符串路径或者如果您希望使用Directory类型:

(get-item $scriptPath).Directory
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 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
}
Run Code Online (Sandbox Code Playgroud)
getParent $scriptPath 2
Run Code Online (Sandbox Code Playgroud)


wis*_*cky 7

您可以split-path根据需要简单地链接多个:

$rootPath = $scriptPath | split-path | split-path
Run Code Online (Sandbox Code Playgroud)


小智 6

Split-Path -Path (Get-Location).Path -Parent
Run Code Online (Sandbox Code Playgroud)


Jon*_*vis 5

在PowerShell 3中,$PsScriptRoot或者您对两个父母的问题,

$dir = ls "$PsScriptRoot\..\.."
Run Code Online (Sandbox Code Playgroud)


Vop*_*pel 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