【问题标题】:Get-ChildItem on Multiple Computers, Performance Issues多台计算机上的 Get-ChildItem,性能问题
【发布时间】:2022-01-26 12:26:40
【问题描述】:

我想改进我的脚本以完成以下任务:

  • 根据特定 OU 上的 get-adcomputer 扫描服务器。
  • 根据每个服务器的驱动器号扫描每个服务器。
  • 扫描每个服务器以查找 log4j
  • 将所有结果导出为 CSV,以标识文件夹路径、文件名和找到文件的服务器。

我一直使用以下代码开始:

$Servers = Get-ADComputer -Filter * -SearchBase "OU=..." | Select -ExpandProperty Name

foreach ($server in $Servers){
   Invoke-Command -ComputerName $Server -ScriptBlock {
       
    $Drives = (Get-PSDrive -PSProvider FileSystem).Root

        foreach ($drive in $Drives){
    
        Get-ChildItem -Path $drive -Force -Filter *log4j* -ErrorAction SilentlyContinue | '
    
            foreach{
                $Item = $_
                $Type = $_.Extension
                $Path = $_.FullName
                $Folder = $_.PSIsContainer
                $Age = $_.CreationTime

                $Path | Select-Object `
                @{n="Name";e={$Item}}, `
                @{n="Created";e={$Age}},`
                @{n="FilePath";e={$Path}},`
                @{n="Extension";e={if($Folder){"Folder"}else{$Type}}}`
             } | Export-Csv C:\Results.csv -NoType
        }
   }

我有以下问题,想解决这些问题来学习。

  1. 如何才能让 CSV 以我想要的方式显示,但让它收集信息并将其存储在我的计算机上,而不是存储在每个本地服务器上?
  2. 在运行此程序时,我注意到远程主机上存在极端的性能问题。 WinRM 在运行时占用 100% 的处理器。我先尝试了-Include,然后是-Filter,但无济于事。如何改进这一点,以便在最坏的情况下,只有我的工作站在消耗性能?
  3. ` 标记到底有什么作用?

【问题讨论】:

  • 您正在枚举远程主机上的整个文件系统,预计这将消耗大量内存和 CPU。代码可以进行大量优化,但主机上的资源问题仍然存在。
  • [1] 在Invoke-Command 之外定义您的脚本块。更容易跟踪并且_minutely_更快。 ///// [2] 不要使用ForEach-Object 调用I-C ... 相反,通过-ComputerName 参数将系统列表提供给I-C 调用。这将使事情并行运行。 ///// [3] 反引号用于换行 - 当您有自然换行符(如管道或逗号)时不需要。 lookee ... >>> Get-PowerShellBlog:Bye Bye Backtick:PowerShell 中的自然线延续 — get-powershellblog.blogspot.com/2017/07/…
  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: powershell powershell-remoting


【解决方案1】:

我同意@SantiagoSquarzon 的观点——这会影响性能。

考虑使用-MaxDepth 参数编写函数以递归方式运行Get-ChildItem,包括偶尔暂停的Start-Sleep 命令。另外,您可能需要注意this link

您还想将 Export-CSV 导出到共享网络驱动器以收集所有机器的结果。

反引号表示该行的延续,如 bash 中的\

最后,考虑使用计划任务或启动具有较低进程优先级的 powershell 子进程,也许会有所帮助?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多