【发布时间】: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
}
}
我有以下问题,想解决这些问题来学习。
- 如何才能让 CSV 以我想要的方式显示,但让它收集信息并将其存储在我的计算机上,而不是存储在每个本地服务器上?
- 在运行此程序时,我注意到远程主机上存在极端的性能问题。 WinRM 在运行时占用 100% 的处理器。我先尝试了-Include,然后是-Filter,但无济于事。如何改进这一点,以便在最坏的情况下,只有我的工作站在消耗性能?
- ` 标记到底有什么作用?
【问题讨论】:
-
您正在枚举远程主机上的整个文件系统,预计这将消耗大量内存和 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