[英]PowerShell multithreading for get-childItem
我需要扫描CIFShare并获取共享中所有文件和文件夹的文件属性和ACL属性。我知道get-chilItem中有-recursive选项,但是如果共享很大,则使用-递归选项确实很耗时。我知道这可以通过多线程实现。
假设层次结构如下:-
Root
Root\FolderA
Root\FolderA\FolderA1\FolderA2\FolderA3\FolderA3\FolderA4
Root\FolderB\..
..
我已经管理了一个脚本,该脚本获取根目录中所有文件和文件夹的文件属性和ACL,并为根目录中的每个文件夹(文件夹A,文件夹B等)启动作业,并且该脚本运行无任何错误。 我尝试为每个文件夹(目录结构中的所有级别)创建作业,这又导致作业挂起或Powershell强制关闭。 我正在使用PowerShell V2.0,并且在我们的环境中无法对该版本进行任何升级。 我是PowerShell的新手,如果这是一个非常愚蠢的问题,请原谅。
先谢谢您的帮助。
您的计算机上是否有PowerShell 3? 如果这样做,则可以创建一个包含文件夹数组列表的工作流。 我没有执行此操作的摘要,但是如果您有兴趣,我可以提出一些建议。
编辑(在下面添加伪代码):
workflow GetFileInformation
{
param([System.IO.FileSystemInfo[]] $folders)
foreach -parallel ($folder in $folders)
{
inlinescript
{
$files = GCI -LiteralPath $folder.FullName -File
# Here you will have an Array of System.IO.FileSystemInfo
# I do not know what you want to do from here,
# but the caller will have no visibility of this object
# since it is on a separate thread.
# but you can write the results to a file or database.
# Hope this helps some.
}
}
}
$dir = GCI C:\ -Directory -Recurse
GetFileInformation $dir
我尝试为每个文件夹(目录结构中的所有级别)创建作业,这又导致作业挂起或Powershell强制关闭。
那是因为您没有限制工作的创造。 您可能正在创建数百个甚至数千个并行作业,这将耗尽任何服务器上的内存。 启动多个并行作业或线程非常好,并且可以缩短整体执行时间-直到创建了太多并行任务或线程,以致系统无法处理负载。
请参阅此SO答案 ,以了解将作业数量限制到合理数量的方法。 为了避免资源争用,我建议将作业数保持在10以下,除非在具有非常快速存储的大型服务器上。
我不会为此使用PowerShell作业。 获取文件和ACL信息是相对简单的任务,并且有内置的可执行文件。 初始化Powershell作业会话是对资源的相当大的投资,而不是对琐碎任务的资源的真正投资。
代替作业,我将使用旧目录和cacls \\ icacls来获取文件和ACL信息,并将输出管道传输到文件以供以后收集和聚合。 使用powershell脚本创建和启动cmd进程,监视创建的进程的进度,以阻止线程创建。 然后返回另一个脚本来收集和汇总文件中的信息。
恕我直言
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.