Function PowerShell重复调用函数

Function PowerShell重复调用函数,function,powershell,workflow,Function,Powershell,Workflow,手头的任务是比较源文件夹和目标文件夹的权限,这是对其所有子文件夹的权限。我已经创建了对一个文件夹执行此检查的函数,它返回$True或$False 我想知道是否有可能创建一个函数,该函数调用它自己,并在它找到的每个子文件夹上执行,以调用Test ACLequalHC。这样,当它由于权限问题或其他原因在其中一个子文件夹中阻塞或出错时,它仍然可以继续处理其他子文件夹 有点像爬虫,如果有道理的话。理想情况下,如果它可以并行运行,那就太好了。我读到工作流最适合这种情况,但我以前从未使用过它 不幸的是,不可

手头的任务是比较源文件夹和目标文件夹的权限,这是对其所有子文件夹的权限。我已经创建了对一个文件夹执行此检查的函数,它返回$True或$False


我想知道是否有可能创建一个函数,该函数调用它自己,并在它找到的每个子文件夹上执行,以调用Test ACLequalHC。这样,当它由于权限问题或其他原因在其中一个子文件夹中阻塞或出错时,它仍然可以继续处理其他子文件夹

有点像爬虫,如果有道理的话。理想情况下,如果它可以并行运行,那就太好了。我读到工作流最适合这种情况,但我以前从未使用过它

不幸的是,不可能只执行$AllSubFolders=Get ChildItem-Recurse,然后执行foreach,因为根文件夹下有数千个文件和文件夹。所以它需要是动态的,这样我们就可以在它找到的每个文件夹上做额外的事情,比如说,如果Test ACLequalHC在一个文件夹上生成$False,我们仍然可以调用其他函数来设置正确的权限,或者将结果添加到CSV

许可测试:

如果它可以将文件检查为继承,并且不添加额外的权限,那就太好了。但是,如果我发现如何制作这样一个能够在文件夹结构中挖掘的爬虫,我会在以后自己身上添加这些东西


谢谢您的帮助。

好的,我认为您对Get ChildItem-Recurse的厌恶是您需要克服的。如果您只查看目录,请为Get-ChildItem使用-directory开关。这是一个提供商级别的交换机,因此它将大大加快速度

接下来,我认为你需要考虑的是广告成员CMDLET。大概是这样的:

$Source = C:\GoodFolder
$AllFolders = GCI C:\ -Directory -Recurse
$AllFolders | ForEach{Add-Member -InputObject $_ -NotePropertyName "ACLGood" -NotePropertyValue (Test-ACLequalHC $source $_.fullname all)}
然后,您可以在上面筛选有问题的文件夹,并根据需要解决它们

$AllFolders | Where{!$_.ACLGood} | ForEach{ Do stuff to fix it }

您有两条路径:源路径和目标路径。对于递归任务,您打算检查哪个子任务?源代码是否保持不变,您是否会检查更多与目标类似的文件?这个递归有多远。您如何确定-recurse太难处理?只是想弄清楚你可以用什么来代替Get-ChildItem-Recurse-Directory当它由于权限问题或其他原因在其中一个子文件夹中阻塞或出错时,它仍然可以继续处理其他子文件夹。调用函数时请参见ErrorAction公共参数Hi Matt,谢谢您的帮助。我认为我确实需要使用GetChildItem,但不需要使用递归,因为这会一次生成太多的内容,无法处理,并且不允许从上到下进行迭代。源文件夹作为静态示例,设置了正确的权限。目标可以有更多或更少的文件夹/文件,也可以有很多数据。这就是为什么我认为如果函数执行一个Get-ChildItem,执行它的操作,然后根据前面的输出调用自身,继续执行下一个Get-ChildItem,这将是合适的。所以它一个接一个地往下走,而不是一下子全部往下走。没有足够的信心来回答这个问题,但在你的函数中不会有一个调用它自己的结束块?。类似于Get ChildItem-Path$Target-Directory | ForEach对象{Test ACLequalHC arguments}这意味着您必须编写比true或false更详细的输出,显然所有函数都可以调用它自己。使用Get-ChildItem-Recurse到底有什么问题?这只是因为它需要永远的时间吗?谢谢你,技术员,我想你是对的。我不得不承认这需要很长时间。在周一的工作中,我将尝试你的建议,只对文件夹,然后我可以做一个foreach的文件。
$AllFolders | Where{!$_.ACLGood} | ForEach{ Do stuff to fix it }