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的新手,如果这是一个非常愚蠢的问题,请原谅。

在此先感谢您的帮助。

4

3 回答 3

1

你的机器上有 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
于 2013-11-01T13:39:02.510 回答
0

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

那是因为你没有限制创造就业机会。您可能正在创建数百个(如果不是数千个)并行作业,这将耗尽任何服务器上的内存。启动多个并行作业或线程非常好,并且可以提高整体执行时间 - 直到您创建了太多以至于您的系统无法处理负载。

有关将作业数量限制在合理数量的方法,请参阅此 SO 答案。为避免资源争用,我建议将作业数保持在 10 以下,除非在具有非常快存储的超大型服务器上。

于 2013-11-01T12:48:33.020 回答
0

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

我将使用旧的 dir 和 cacls\icacls 来获取文件和 ACL 信息,而不是作业,然后将输出通过管道传输到文件以供稍后收集和聚合。使用 powershell 脚本创建和启动 cmd 进程,监控创建进程的进度以保持线程创建受到限制。然后返回另一个脚本以收集和汇总文件中的信息。

恕我直言

于 2013-11-01T13:24:36.410 回答