繁体   English   中英

用于get-childItem的PowerShell多线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM