带返回值的 Powershell 递归

2023-12-20

我正在尝试编写一个递归函数,它将返回数组中的信息,但是当我将 return 语句放入函数中时,它会丢失某些条目。

我试图递归地查看指定深度的文件夹,获取与该文件夹关联的 acl。我知道 getChildItem 有一个递归选项,但我只想单步执行 3 层文件夹。

下面的代码摘录是我一直用于测试的代码。当调用 getACLS 而不使用 return 语句(下面注释掉)时,结果为:

Folder 1

文件夹12

文件夹13

Folder 2

当使用 return 语句时,我得到以下输出:

Folder 1

文件夹12

那么看起来 return 语句正在退出递归循环?

我的想法是我想返回一个多维数组,例如 [文件夹名称,[acls],[[子文件夹,[权限],[[...]]]]] 等。

cls

function getACLS ([string]$path, [int]$max, [int]$current) {

    $dirs = Get-ChildItem -Path $path | Where { $_.psIsContainer }
    $acls = Get-Acl -Path $path
    $security = @()

    foreach ($acl in $acls.Access) {
        $security += ($acl.IdentityReference, $acl.FileSystemRights)
    }   

    if ($current -le $max) {
        if ($dirs) {
            foreach ($dir in $dirs) {
                $newPath = $path + '\' + $dir.Name
                Write-Host $dir.Name
   #            return ($newPath, $security, getACLS $newPath $max ($current+1))
   #            getACLS $newPath $max ($current+1)
                return getACLS $newPath $max ($current+1)
            }   
        }
    } elseif ($current -eq $max ) {
        Write-Host max
        return ($path, $security)
    }
}

$results = getACLS "PATH\Testing" 2 0

问题是返回的位置。我将它放在 foreach 循环中,这意味着它试图在一个函数中多次返回。我将它移到了 foreach 之外,移到了 if 语句中。

function getACLS ([string]$path, [int]$max, [int]$current) {

$dirs = Get-ChildItem -Path $path | Where { $_.psIsContainer }
$acls = Get-Acl -Path $path
$security = @()
$results = @()

foreach ($acl in $acls.Access) {
    $security += ($acl.IdentityReference, $acl.FileSystemRights)
}   

if ($current -lt $max) {
    if ($dirs) {
        foreach ($dir in $dirs) {
            $newPath = $path + '\' + $dir.Name
            $next = $current + 1
            $results += (getACLS $newPath $max $next)
        }   
    } else {
        $results = ($path, $security)
    }
    return ($path, $security, $results)
} elseif ($current -eq $max ) {
    return ($path, $security)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带返回值的 Powershell 递归 的相关文章

  • Powershell 新的 ScheduledTaskSettingsSet

    我尝试添加新的ScheduledTaskSettingsSet https technet microsoft com en us library jj649824 v wps 630 aspx具有自定义设置 根据 Technet 有可能的
  • 是否存在 IsCallable 为 false 但 IsConstructor 为 true 的 JS 对象?

    ECMAScript 规范函数可调用 https www ecma international org ecma 262 6 0 index html sec iscallable当且仅当其参数具有 Call 内部方法时返回 true 它在
  • 将嵌套数组中的“点符号”键扩展到子数组

    我从某个任意深度的嵌套数组开始 在该数组中 一些键是一系列由点分隔的标记 例如 billingAddress street 或 foo bar baz 我想将这些键控元素扩展到数组 因此结果是一个嵌套数组 其中所有这些键都已扩展 例如 bi
  • 如何在 Snowflake 中编写等效的 IF ELSE 即席 SQL 查询

    我正在尝试创建一个与以下基于 T SQL 的即席查询等效的 Snowflake T SQL version Declare i int 0 If i 0 PRINT 0 Else Begin PRINT 1 RETURN PRINT 2 E
  • 如何将 PowerShell cmdlet 或函数添加到我的计算机以使其始终可用?

    如果我找到 或创建 新的 PowerShell cmdlet 或函数 如何将其添加到我的计算机 我是否将其复制到特定文件夹 我是否将其内容放入特定文件中 我是否需要授权 签名或以某种方式给予许可 我不想只在一次会话中使用它 我希望每当我在此
  • 这种间接函数调用有什么好处?

    我在库中找到了以下代码 class Bar public bool foo int i return foo i private virtual bool foo int i 0 现在我想知道 为什么要使用这种间接方式 是否有任何理由说明上
  • 点击事件的事件处理程序自动触发 - jQuery [重复]

    这个问题在这里已经有答案了 可能的重复 为什么单击事件处理程序会在页面加载后立即触发 https stackoverflow com questions 7102413 why does click event handler fire i
  • 如果未提供值,如何从 cmdlet 中省略 powershell 参数?

    我正在尝试执行下面的 Powershell 命令 在交换服务器上创建一个新的地址列表 其中包含名称 容器等参数 Container是可选输入 参数 如果未提供其值 如何从 cmdlet 中省略它 我尝试过IF有条件但但似乎不起作用 这里有什
  • 可以声明对 Rust 中未使用的结果发出警告的函数吗? [复制]

    这个问题在这里已经有答案了 Rust 是否有办法声明一个函数 对于任何类型 不使用其结果都会发出警告 类似于 GCC 的东西 attribute warn unused result 自 1 27 起 must use 也适用于函数 看来
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • matlab中求和函数句柄

    Hi我试图对两个函数句柄求和 但它不起作用 例如 y1 x x x y2 x x x 3 x y3 y1 y2 我收到的错误是 对于 function handle 类型的输入参数 未定义函数或方法 plus 这只是一个小例子 实际上我实际
  • 递归例程获取PropertyInfo

    我正在尝试创建一个递归例程 它将检索指定对象 在 NET 3 5 中 下的所有成员的 PropertyInfos 直接成员的一切都正常 但它还需要解析嵌套类 及其嵌套类等 我不明白如何处理解析嵌套类的部分 这部分代码你会怎么写呢 publi
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • “(”字符在 PowerShell 中不起作用

    我无法让它发挥作用 它不喜欢 字符 我如何解决它 Dir Rename Item NewName name replace 如何在 PowerShell 中处理这种类型的特殊字符 vonPryze 对问题的确切原因做了很好的解释 但还有一个
  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • 问题与 Assembly x86-32 RET n 指令有关

    我知道 Ret n 的含义 但我无法弄清楚它在维护程序运行时堆栈方面的作用 我在那里有点困惑 ret 和栈有关系吗 ret n就好像ret add esp n 您可以将其用于 caller pops 调用约定 Plain ret就好像pop
  • 在递归函数javascript上获取返回未定义

    我听说递归函数很强大 所以我尝试创建一个函数来增加一个数字 直到达到某些点 而不是通过循环 当它到达时我试图返回该值 但它给出了undefined CODE var i 1 function rec i console log i if i
  • 打破java中的递归

    递归有点像 分而治之 的风格 它在变得更小的同时分裂 树数据结构 我希望它在发现违规时完全中断 这意味着打破所有递归路径 并返回 true 这可能吗 无论你做什么 你都必须释放堆栈 这留下了两个选择 魔法返回值 正如汤姆之一所描述的 抛出异
  • 使用 powershell 从 tfs 获取项目的最新版本

    我正在尝试使用 powershell 自动化我们的日常开发人员任务 我的 powershell 脚本已经完成一半了 我想从 TFS 获取特定项目的最新版本 开发人员将可以访问 TFS 中的多个项目 在这些项目中 特定项目下的文件需要更新 我

随机推荐