所以如果我有一个目录存储在一个变量中,说:
$scriptPath = (Get-ScriptDirectory);
现在我想找到目录 two parent levels up.
我需要一个好的方法:
$parentPath = Split-Path -parent $scriptPath
$rootPath = Split-Path -parent $parentPath
我可以在一行代码中到达 rootPath 吗?
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。
我已经这样解决了:
$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
您可以在反斜杠处拆分它,并使用倒数第二个具有负数组索引的目录来获取祖父目录名称。
($scriptpath -split '\\')[-2]
你必须加倍反斜杠才能在正则表达式中转义它。
获取整个路径:
($path -split '\\')[0..(($path -split '\\').count -2)] -join '\'
并且,查看 split-path 的参数,它将路径作为管道输入,所以:
$rootpath = $scriptpath | split-path -parent | split-path -parent
你可以使用
(get-item $scriptPath).Directoryname
获取字符串路径或者如果你想要目录类型使用:
(get-item $scriptPath).Directory
您可以根据需要简单地链接任意数量的
split-path
:
$rootPath = $scriptPath | split-path | split-path
这是最简单的解决方案
"$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
在 PowerShell 3 中,
$PsScriptRoot
或者对于你的两个父母的问题,
$dir = ls "$PsScriptRoot\..\.."
Split-Path -Path (Get-Location).Path -Parent
对其他答案进行一些推断(以尽可能对初学者友好的方式):
使用 GetType 方法检查对象类型以查看您正在使用的内容:
$scriptPath.GetType()
最后,一个有助于制作单行代码的快速提示:Get-Item 有
gi
别名,Get-ChildItem 有 gci
别名。
如果你想使用 $PSScriptRoot 你可以这样做
Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
在Powershell中:
$this_script_path = $(Get-Item $($MyInvocation.MyCommand.Path)).DirectoryName
$parent_folder = Split-Path $this_script_path -Leaf
类型为
FileInfo
、DirectoryInfo
、String
时对应的处理方法如下:
$myPath | Split-Path
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