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


94

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

$scriptPath = (Get-ScriptDirectory);

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

我需要一个很好的方法:

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

我可以用一行代码进入rootPath吗?

Answers:


158

目录的版本

get-item 是您在这里的友好帮助之手。

(get-item $scriptPath ).parent.parent

如果只想要字符串

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

文件版本

如果$scriptPath指向文件,则必须首先调用该文件的Directory属性,因此调用看起来像这样

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

备注
仅在$scriptPath存在时才起作用。否则,您必须使用Split-Pathcmdlet。


很棒的@rerun,它返回目录对象,然后返回字符串路径的命令是什么?
Mark Kadlec'3

12
.parent仅适用于目录对象。如果我有文件路径,并且想找到该文件所在目录的父目录,则需要使用(get-item $PathToFile ).Directory.parent
Baodad 2014年

6
请注意,这仅在$scriptPath存在时有效。否则就使用Split-Path $scriptPath -parent
orad 2014年

1
我提议将@Baodad评论合并到您的答案中,这样SO的其他成员就可以看到。
SOReader


21

您可以在反斜杠处将其分割,然后使用负数组索引获取倒数第二个,仅获得祖父母目录名称。

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

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

获取完整路径:

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

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

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

应该先检查那些参数。
mjolinor 2012年

12

您可以使用

(get-item $scriptPath).Directoryname

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

(get-item $scriptPath).Directory


5

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

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


2

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

  • 可以通过诸如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。

使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.