Powershell向后爬升目录树

Powershell向后爬升目录树,powershell,Powershell,我的脚本位于C:\projects\bacon\packages\build\run.ps1中,我正在尝试查找解决方案文件夹(在本例中为bacon)。我发现的所有东西都显示了如果你知道文件夹名称,如何向前爬。但是我不知道项目名称,所以我需要向后爬升,直到找到在给定脚本路径中包含packages或dependencies文件夹的第一个包含文件夹 我发现的最接近的函数是使用Split Path$script:MyInvocation.MyCommand.Path获取脚本的路径,并以某种方式向后循环?

我的脚本位于
C:\projects\bacon\packages\build\run.ps1
中,我正在尝试查找解决方案文件夹(在本例中为bacon)。我发现的所有东西都显示了如果你知道文件夹名称,如何向前爬。但是我不知道项目名称,所以我需要向后爬升,直到找到在给定脚本路径中包含packages或dependencies文件夹的第一个包含文件夹


我发现的最接近的函数是使用
Split Path$script:MyInvocation.MyCommand.Path
获取脚本的路径,并以某种方式向后循环?但在找到“packages”或“dependencies”文件夹之前,我找不到任何向后循环文件夹的方法

您可以结合使用
Get Item
Get ChildItem
Get Item
返回具有父属性的对象。您可以将
Get ChildItem
限制为仅包含目录对象。然后,您可以使用此选项向后跋涉:

$current = Get-Item .
Write-Host $Current.Parent
do
{
    $parent = Get-Item $current.Parent.FullName
    $childDirectories = $parent | Get-ChildItem -Directory | ? { $_.Name -in @("dependencies","packages") }
    $current = $parent
} until ($childDirectories)
$bacon = $parent.FullName
我应该说,第一行
$current=Get Item.
只有在PowerShell运行空间的当前路径位于您正在使用的树的末尾时才会按原样工作


在脚本中,如果您使用的是v3,您可以将
替换为
$PSScriptRoot

不起作用?获取此错误:Get Item:无法将参数绑定到参数“Path”,因为它为null。在C:\Projects\Bacon\release3.5\Dependencies\BuildScripts\run.ps1:4 char:24+$parent=获取项$current.parent.FullName+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+CategoryInfo:InvalidData:(:)[Get Item],ParameterBindingValidationException+FullyQualifiederRorNotallowed,Microsoft.PowerShell.Commands.GetItemCommands您在哪个版本的PowerShell中运行此命令?此外,如果运行空间在根文件夹(例如C:)中启动,则父属性将为空。根据$PSVersionTable.PSVersion-3.0,在原始示例中添加了一些代码以帮助解决此问题,如果父属性为空,您所在的PSProvider与文件系统不同,或者位于根驱动器。错误:Get Item:无法将参数绑定到参数“Path”,因为它为null。在C:\Projects\Bacon\release3.5\Dependencies\BuildScripts\test.ps1:5 char:24+$parent=获取项$current.parent.FullName+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+CategoryInfo:InvalidData:(:)[Get Item],ParameterBindingValidationException+FullyQualifiedErrorNotallow,Microsoft.PowerShell.Commands.GetItemCommand