是否可以加快扫描特定服务名称的计算机列表?

时间:2018-03-19 03:39:12

标签: powershell powershell-v3.0 powershell-v4.0

我是PowerShell的新手,我目前正在制作一个简单的服务监控脚本。现在我有一个计算机名列表和我扫描的服务名列表。

我将扫描保存到日志中。我想知道是否有任何方法可以加快我的PowerShell代码速度?我不确定我是否使用最快的方法来完成这项工作。

此代码是否有任何已知的替代方案可以更快地扫描服务?

$myServices = $PSScriptRoot + "\services.txt" # $PSScriptRoot references current directory
$myServers = $PSScriptRoot + "\servers.txt"
$Log = $PSScriptRoot + "\svclog.csv"
$LogLive = $PSScriptRoot + "\svclogLive.csv"


$serviceList = Get-Content $myServices

Remove-Item -Path $Log


$results = Get-Content $myServers | ForEach-Object {
    foreach ($service in $serviceList) {
        if ($s=get-service -computer $_ -name $service -ErrorAction SilentlyContinue)
        {
            $s | select MachineName, ServiceName, Status, StartType
        } else {
            # "$_ - Service '$service' does not exist."
        }
    }
}

$results | Export-CSV $Log -notypeinformation

# Create a second current log that Python can read while this script runs
Copy-Item -Path $Log -Destination $LogLive

2 个答案:

答案 0 :(得分:2)

使用Invoke-command

$serviceList = Get-Content $myServices

#some code

$results = Get-Content $myServers
Invoke-command -ComputerName $results -ScriptBlock {
Param($MyServices)
    Get-Service -Name $MyServices | Select-Object -Property ServiceName, Status, StartType
} -ArgumentList $MyServices,$Null | Select-Object -Property ServiceName, Status, StartType,PSComputerName |
Export-Csv -NoTypeInformation -Path $Log

#For getting starttype in Version 2.0
Get-wmiObject -class Win32_Service -Filter "Name='BITS'" | Select-Object -Property Name, State, startMode

答案 1 :(得分:1)

您可以尝试捕获数组中的所有目标服务器服务并查看它,而不是在您要搜索的每个服务上调用$myServices = $PSScriptRoot + "\services.txt" # $PSScriptRoot references current directory $myServers = $PSScriptRoot + "\servers.txt" $Log = $PSScriptRoot + "\svclog.csv" $LogLive = $PSScriptRoot + "\svclogLive.csv" $serviceList = Get-Content $myServices Remove-Item -Path $Log $results = Get-Content $myServers | ForEach-Object { # All of the services in one grab $serverServices = @(Get-Service -computer $_ -ErrorAction SilentlyContinue) if ($serverServices) { foreach ($service in $serviceList) { #Note: this inner use of another $_ may confuse PowerShell... if ($s = ($serverServices | Where {$_.Name -eq $service})) { $s | select MachineName, ServiceName, Status, StartType } else { # "$_ - Service '$service' does not exist." } } } } $results | Export-CSV $Log -notypeinformation # Create a second current log that Python can read while this script runs Copy-Item -Path $Log -Destination $LogLive

/var/log/maillog