我有一个简单的脚本,可以在多个服务器上查找文件。问题在于,每台服务器上都挂有CPU并导致生产工作负载出现问题。我如何才能使该脚本不对我的机器进行DDoS处理?!
Start-transcript C:\tools\Querylog.txt
$Servers = Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (Enabled -eq "True")} -Properties OperatingSystem
Invoke-command -ComputerName $Server-ScriptBlock {Get-ChildItem -Path $_.Root -Recurse -Force -File -ErrorAction SilentlyContinue | Where-Object { $_.Name -like '*somefile-readme*' } |Out-File -FilePath <filePath>\results.txt -Append}
Stop-Transcript
答案 0 :(得分:2)
Use the -Filter
option with Get-ChildItem
,它比返回所有对象并使用Where-Object
进行过滤的性能要高得多。
此外,与您的CPU问题无关,但在如何设计Get-ADComputer
调用方面,请为这些cmdlet上的-Filter
自变量使用you should use a String
, not a ScriptBlock
。从那个答案:
-Filter
不支持ScriptBlocks
,但它们有时会工作的种类,因为它们在评估之前就已获得ToString。如果您使用$_
或$emailAddress
之类的简单变量扩展,它们在技术上会起作用,但最终会令您头疼,特别是如果您尝试访问对象属性(如上),因为它根本不会工作。每次都使用字符串过滤器,如果需要将对象属性用作过滤器参数,请使用Variable Substitution或Command Substitution。