我需要扫描CIFShare并获取共享中所有文件和文件夹的文件属性和ACL属性。我知道在get-chilItem中有一个-recursive选项,但是如果共享非常大,使用-recursive选项非常耗时。我知道这可以通过多线程来实现。
假设层次结构如下: -
Root
Root\FolderA
Root\FolderA\FolderA1\FolderA2\FolderA3\FolderA3\FolderA4
Root\FolderB\..
..
我已经管理了一个脚本,该脚本获取根目录中所有文件和文件夹的文件属性和ACL,并为根目录中的每个文件夹(文件夹A,文件夹B等)启动作业,该文件没有任何错误。我尝试为每个文件夹(目录结构中的所有级别)创建作业,这反过来导致作业挂起或PowerShell强制关闭。 我使用的是PowerShell V2.0,在我们的环境中无法对该版本进行任何升级。我是powershell的新手,如果这是一个非常愚蠢的问题,请原谅。
提前感谢您的帮助。
答案 0 :(得分:1)
您是否在机器上安装了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 :(得分:0)
我尝试为每个文件夹(目录结构中的所有级别)创建作业,这反过来导致作业挂起或PowerShell被强制关闭。
那是因为你没有限制创造就业机会。您可能正在创建数百个(如果不是数千个)并行作业,这将会耗尽任何服务器上的内存。启动多个并行作业或线程非常棒,可以改善总体执行时间 - 直到您创建了太多以至于系统无法处理负载。
有关将作业数限制为合理计数的方法,请参阅this SO answer。为避免资源争用,我建议将作业数保持在10以下,但存储速度非常快的非常大的服务器除外。
答案 2 :(得分:0)
我不会为此使用PowerShell作业。获取文件和ACL信息是一项相对简单的任务,并且有可用的内置可执行文件。初始化Powershell工作会议是对资源的相当大的投入,而不是对琐碎任务的良好资源投入。
我将使用遗留dir和cacls \ icacls来获取文件和ACL信息,而不是作业,输出通过管道传输到文件以便以后进行收集和聚合。使用powershell脚本创建和启动cmd进程,监视已创建进程的进度以防止创建线程。然后返回另一个脚本来收集和汇总文件中的信息。
IMHO