Powershell 反向列出每个子文件夹
我有一个UNC路径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
$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说了什么!