如何在 Powershell 找到父母的电话簿?

因此,如果我有一个存储在变量中的目录,比如:

$scriptPath = (Get-ScriptDirectory);

现在我想找到目录 的父级。

我需要一个好的方法:

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

我可以用一行代码访问 rootPath 吗?

235243 次浏览

您可以在反斜杠处分割它,然后使用带负数组索引的倒数第二个目录名来获得祖辈目录名。

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

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

为了得到整个路径:

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

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

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

Version for a directory

get-item是你们友好的帮手。

(get-item $scriptPath ).parent.parent

If you Want the string only

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

Version for a file

如果 $scriptPath指向一个文件,那么您必须首先调用该文件的 Directory属性,因此调用如下所示

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

备注
这只有在 $scriptPath存在的情况下才有效,否则必须使用 Split-Pathcmdlet。

You can use

(get-item $scriptPath).Directoryname

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

(get-item $scriptPath).Directory

在 PowerShell 3、 $PsScriptRoot或者为你的两个父母的问题上,

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

在 Powershell 中:

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


$parent_folder = Split-Path $this_script_path -Leaf

I've solved that like this:

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

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

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
Split-Path -Path (Get-Location).Path -Parent

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

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

To extrapolate a bit on the other answers (in as Beginner-friendly a way as possible):

  • 指向有效路径的字符串对象可以通过 Get-Item 和 Get-ChildItem 等函数转换为 DirectoryInfo/FileInfo 对象。
  • .Parent can only be used on a DirectoryInfo object.
  • .Directory 将 FileInfo 对象转换为 DirectoryInfo 对象(针对文件的目录) ,如果在任何其他类型的 (甚至是另一个 DirectoryInfo 对象)上使用,则返回 null。
  • .DirectoryName converts a FileInfo object to a String object (targeting the file's directory), and will return null if used on any other type (甚至是另一个 String 对象).
  • . FullName 将 DirectoryInfo/FileInfo 对象转换为 String 对象,如果在任何其他类型 (even another DirectoryInfo/FileInfo object)上使用,则返回 null。
  • Path 将 PathInfo 对象转换为 String 对象,如果在任何其他类型 (甚至是另一个 PathInfo 对象)上使用,则返回 null。

使用 GetType 方法检查对象类型,以查看使用的是什么: $scriptPath.GetType()

最后,一个有助于制作一行代码的小技巧: Get-Item 有 gi别名,Get-ChildItem 有 gci别名。

最简单的解决办法

Here's the simplest solution

"$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