Powershell 反向列出每个子文件夹

Powershell 反向列出每个子文件夹,powershell,Powershell,我有一个UNC路径 $path = "\\ad.testxyz.com\corp\technology\software\data\iso" 我需要对以下路径应用权限: \\ad.testxyz.com\corp\technology\software\data \\ad.testxyz.com\corp\technology\software \\ad.testxyz.com\corp\technology 产出: \\ad.domain.com\corp\technology \\ad.d

我有一个UNC路径

$path = "\\ad.testxyz.com\corp\technology\software\data\iso"
我需要对以下路径应用权限:

\\ad.testxyz.com\corp\technology\software\data \\ad.testxyz.com\corp\technology\software \\ad.testxyz.com\corp\technology 产出:

\\ad.domain.com\corp\technology \\ad.domain.com\corp\technology\test \\ad.domain.com\corp\technology\test\information \\ad.domain.com\corp\technology \\ad.domain.com\corp\technology\test \\ad.domain.com\corp\technology\test\information 但是如果我尝试使用一个带有空格的路径,我会得到以下结果

\\ad.domain.com\corp\technology \\ad.domain.com\corp\technology\payer \\ad.domain.com\corp\technology\payer\information \\ad.domain.com\corp\technology\payer\information\extracts \\ad.domain.com\corp\technology\payer\information\extracts\item \\ad.domain.com\corp\technology \\ad.domain.com\corp\technology\payer \\ad.domain.com\corp\technology\payer\information \\ad.domain.com\corp\technology\payer\information\extracts \\ad.domain.com\corp\technology\payer\information\extracts\item
我明白了。这对其他任何人都适用

$path = "\\ad.domain.com\corp\technology\test\payer information\software"

# Split string by "\", remove null elements
$tree = $path.Split([system.io.path]::DirectorySeparatorChar) | ? {$_}

# Recursively list all top level folders in [path]. (Excludes DFS root)
For ($i=2; $i -lt $tree.Length - 1; $i++) {
    # Recursively build every directory up the tree
    $leaf = "\" + $tree[$i]
    $branch += $leaf
    $trunk = "\\" + $tree[0] + "\" + $tree[1] + $branch

    # do work
    Write-Host $trunk
}
产出:
\\ad.domain.com\corp\technology
\\ad.domain.com\corp\technology\test

\\ad.domain.com\corp\technology\test\payer information

有一些内置的方法来处理路径操作。[咧嘴笑]

最简单的方法是使用
DirInfo
对象的
.Parent
属性,该对象是在文件系统上运行时从
get ChildItem
get Item
返回的。这可能无法使用,因为您似乎只有字符串可以使用

下一个最简单的方法是使用
分割路径
-Parent
开关一次跳上一级。下面的代码就是这样做的

$SamplePathList = @(
    '\\ad.domain.com\corp\technology\test\information\software'
    '\\ad.domain.com\corp\technology\payer information\extracts\item load'
    )
$StopAt = '\\ad.domain.com\corp\technology'

$Results = foreach ($SPL_Item in $SamplePathList)
    {
    $TempPath = $SPL_Item
    # send starting path to $Results
    $TempPath

    while ($TempPath -ne $StopAt)
        {
        $TempPath = Split-Path -Path $TempPath -Parent
        # send to $Results
        $TempPath
        }
    }

$Results
输出

\\ad.domain.com\corp\technology\test\information\software
\\ad.domain.com\corp\technology\test\information
\\ad.domain.com\corp\technology\test
\\ad.domain.com\corp\technology
\\ad.domain.com\corp\technology\payer information\extracts\item load
\\ad.domain.com\corp\technology\payer information\extracts
\\ad.domain.com\corp\technology\payer information
\\ad.domain.com\corp\technology

不要手动执行此操作![grin]使用
分割路径
或使用从
获取ChildItem
返回的dirinfo对象的
.Parent
属性。我可能会使用其中的第二个。为了使您的代码正常工作,请使用此
$path.split(“\”,[System.StringSplitOptions]::removeMptyEntries)
替换拆分,因为第二个拆分分离包含空格的路径部分。还有,@Lee_Dailey说了什么!