PowerShell删除递归变量的完整路径

PowerShell删除递归变量的完整路径,powershell,recursion,get-childitem,Powershell,Recursion,Get Childitem,我有一个简单的脚本,可以遍历目录树 function GetSubFolders([IO.DirectoryInfo]$folder) { Write-Host "Getting folder $folder" Get-ChildItem $folder | ? { $_.PSIsContainer } | % { GetSubFolders $_ } } 如果调用GetSubFolders“c:\temp”,则在c:\temp中找到的每个子目录都会失败: Get-Child

我有一个简单的脚本,可以遍历目录树

function GetSubFolders([IO.DirectoryInfo]$folder) {
    Write-Host "Getting folder $folder"

    Get-ChildItem $folder | ? { $_.PSIsContainer } | % { GetSubFolders $_ }
}
如果调用
GetSubFolders“c:\temp”
,则在c:\temp中找到的每个子目录都会失败:

Get-ChildItem:找不到路径“C:\WINDOWS\system32\somefolder”

其中“somefolder”是c:\temp的子目录。变量
$\uuu
显然是一个
System.IO.DirectoryInfo
对象,但为什么它会从绝对路径中剥离,并突然相对于当前目录c:\windows\system32创建?请注意,进入此方法后,它会正确输出

正在获取文件夹c:\temp

这意味着它只工作一次,因此
Get ChildItem
接受
DirectoryInfo
对象作为参数不会有问题。

尝试使用

Get-ChildItem -Path 'c:\temp' -Recurse -Directory
目录标志将在V3中可用。如果不使用V3,也可以使用

Get-ChildItem -Path 'c:\temp' -Recurse | ? { $_.PSIsContainer }
编辑: 目录标志在V3中可用。 感谢Ansgar Wiechers的评论

function GetSubFolders([IO.DirectoryInfo]$folder) {
    Write-Host "Getting folder $folder"
    Get-ChildItem $folder | ? { $_.PSIsContainer } | % { GetSubFolders $_.FullName }
}

我认为您正在寻找属性
FullName

使用递归/管道的解决方案效率非常低。正如其他建议的那样,更好地使用带有GCI的递归开关。但也有一个循环/队列的替代方案。这将适用于任何类型的树对象—通过根节点的子节点循环,如果子节点有更多节点—将其添加到队列中

function Get-SubfolderQueue { param([IO.directoryinfo]$dir)

 $queue = New-Object System.Collections.Queue
 $queue.Enqueue($dir)

 While($queue.Count -gt 0) {
    $curr = $queue.Dequeue()
    foreach ($d in $curr.GetDirectories()) {
        Write-Output $d
        If($d.GetDirectories().Count -gt 0) { 
           $queue.Enqueue($d)
         }
    }
 }

}

您试图使用一个对象“按名称”或“按位置”,该对象仅与
Get ChildItem的
-name
属性相匹配。
[grin]看看这个
[io.directoryinfo]'C:\temp';选择object-property*
,然后将其与
(Get Help Get ChildItem-Parameter*)中的列表进行比较。name
。请注意,第一个对象中缺少任何
-Path
或-LiteralPath`属性名。那么,为什么它只工作一次,这就是为什么我感到困惑的原因。我不知道。。。对我来说,它似乎总是失败。这是我用来解决的问题,但如果$是directoryinfo对象,为什么需要.FullName?powershell处理对象。每个对象都有多个属性(通常)。因此,在像您这样的特定场景中,其中一些应该返回其中一个(属性)作为默认值。在您的情况下,默认值是name,但不是fullname。另一种方法是在开始时使用$folder.fullname,而不是在结尾使用$\ fullname。另一种方法是:(gci$folder-recurse | where{$\ mode-like'd*')。fullname | sort