首页 文章

用于get-childItem的PowerShell多线程

提问于
浏览
1

我需要扫描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的新手,如果这是一个非常愚蠢的问题,请原谅 .

在此先感谢您的帮助 .

3 回答

  • 0

    你有机器上的PowerShell 3吗?如果这样做,那么您可以创建一个采用文件夹的arraylist的工作流程 . 我没有这样做的片段,但如果你有兴趣,我可以拿出一些东西 .

    编辑(在下面添加伪代码):

    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
    
  • 1

    我尝试为每个文件夹(目录结构中的所有级别)创建作业,这反过来导致作业挂起或PowerShell强制关闭 .

    那个's because you'不会限制创造就业机会 . 您可能正在创建数百个(如果不是数千个)并行作业,这将会耗尽任何服务器上的内存 . 启动多个并行作业或线程非常好,可以缩短总体执行时间 - 直到您创建了太多以至于系统无法处理负载 .

    有关将作业数量限制为合理计数的方法,请参阅this SO answer . 为了避免资源争用,我建议将作业数保持在10以下,除非存储速度非常快的超大型服务器 .

  • 0

    我不会为此使用PowerShell作业 . 获取文件和ACL信息是一项相对简单的任务,并且有可用的内置可执行文件 . 初始化Powershell工作 Session 是对资源的相当大的投入,而不是对琐碎任务的良好资源投入 .

    我会使用遗留的dir和cacls \ icacls来获取文件和ACL信息,输出通过管道传输到文件以便稍后进行收集和聚合,而不是作业 . 使用powershell脚本创建和启动cmd进程,监视已创建进程的进度以防止创建线程 . 然后返回另一个脚本来收集和聚合文件中的信息 .

    恕我直言

相关问题