약 15 개의 원격 서버에서 버전을 확인하는 스크립트를 작성 중이며 스크립트가 예상보다 오래 실행됩니다.Powershell 스크립트가 느리게 실행 됨
$listServers = @("compName1", "compName2", "compName3", ... "compName15")
"" | Out-File C:\temp\javaVersion.txt
"" | Out-File C:\temp\javaVersionLog.txt
$cred = Get-Credential
ForEach ($server in $listServers)
{
Measure-Command {$javaVersion = Invoke-Command -ComputerName $server -Credential $cred -Authentication Kerberos -ScriptBlock {Get-WmiObject -Class Win32_Product -Filter "Name like 'Java [0-9]%'" | Select -ExcludeProperty Version}} -ErrorAction SilentlyContinue -ErrorVariable errorOutput
$errorOutput | Out-File C:\temp\javaVersionLog.txt -Append
$server + $javaVersion | Out-File C:\temp\javaVersion.txt -Append
}
이것은 Measure-Command 출력에 따라 완료하는 데 약 21 초가 걸립니다. 스크립트가 완료되는 데 너무 오래 걸리는 이유가 있습니까?
편집 :
다른 문제로 혼란스러워하고 마침내 스크립트를 마쳤습니다.
Start-Transcript C:\temp\javaVersion.txt
$listServers = @("compName1", "compName2", "compName3", ... "compName15")
$javaVersVerbose = ""
Invoke-Command -ComputerName $listServers -ScriptBlock {
$registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $_);
$javaKey = $registry.OpenSubKey('SOFTWARE\JavaSoft\Java Runtime Environment');
$javaVers = $javaKey.GetValue('CurrentVersion');
$javaVersVerbose = $javaKey.GetValue('Java' + $javaVers.Substring(2, 1) + 'FamilyVersion');
$nameKey = $registry.OpenSubKey('SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName');
$name = $nameKey.GetValue('ComputerName');
$name + " " + $javaVersVerbose | echo
} -ErrorAction SilentlyContinue -ErrorVariable errorOutput
$errorOutput | echo
Write-Host -NoNewLine 'Press any key to continue...'
$null = $Host.UI.RawUI.ReadKey('NoEcho, IncludeKeyDown')
이유는 Win32_Product와입니다.) 아니, 진지하게. 나는 그것이 거대한 클래스라고 생각합니다. 그래서 항상 쿼리하는 것이 너무 느립니다. PS 3.0에서는 [workflows] (http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/26/powershell-workflows-the-basics.aspx)를 사용하여 스크립트 블록을 병렬로 실행할 수 있습니다. 또는 (또는 그 외에도) 버전 번호 만 필요한 경우 Get-Item을 사용하여 레지스트리를 쿼리 할 수 있습니다. 훨씬 빠릅니다. –