功能中的功能 - Powershell

时间:2018-03-28 19:55:17

标签: powershell

好的,我会尽力解释这个问题。最初只是一个简单的脚本变成了一个巨大的混乱,现在我无法弄清楚如何让它工作。我已经有一段时间来这里寻求答案,所以也许你们可以提供帮助。

我要做的是导入系统列表并检查它们是否在线。如果他们在线,他们会进入一个列表,如果没有,他们会进入另一个列表。

foreach ($server in $servers) {
    if (Test-Connection $server -Count 1 -ea 0 -Quiet) { 
        Write-Host "$server Is Up" -ForegroundColor Green
        $server | out-file -Append $liveSystems -ErrorAction SilentlyContinue 
    } else { 
        Write-Host "$server Is Down" -ForegroundColor Red
        $server | out-file -Append $inactive -ErrorAction SilentlyContinue  
    }
}

从那里我检查我需要安装的应用程序是否在系统上。这就是事情开始偏离轨道的地方。当我运行函数来处理$ liveSystems文件时,我得到的是文件的最后一行(或者反复使用相同的系统)而不是每个系统应该是。

function Is-Installed( $program ) {

    $x86 = ((Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall") |
            Where-Object { $_.GetValue( "DisplayName" ) -like "*$program*" } ).Length -gt 0;

    $x64 = ((Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall") |
        Where-Object { $_.GetValue( "DisplayName" ) -like "*$program*" } ).Length -gt 0;
}

$program

function process-file1 {

    param($filename)

    Get-Content $filename -PipelineVariable line | ForEach-Object {
      Is-Installed -program "My_Service"
        if (Is-Installed -eq "True") {
            Write-Host "$server has agent installed" -ForegroundColor Green
            $server | Out-File $installed -ErrorAction SilentlyContinue
        }
        else
        {
            Write-Host "$server does not have agent installed" -ForegroundColor Red
            $server | Out-File -Append $notInstalled -ErrorAction SilentlyContinue
        }
    }
}

process-file1 -filename $liveSystems

一旦我可以让系统通过已安装和未安装的列表进行处理,我试图获取已安装系统的列表并检查哪些系统正在运行服务以及哪些服务没有运行。

$array = @()            
foreach($i in (gc $installed)) {            
    $svc = Get-Service my_service -ComputerName $i -ea "0"            
    $obj = New-Object psobject -Property @{            
        Name = $svc.name            
        Status = $svc.status            
        Computer = $i            
    }            
    $array += $obj            
}                      
$array | Select Computer,Name,Status | Export-Csv -Path $resultsFile - 
NoTypeInformation

最后但并非最不重要的是,我会查看正在运行但未运行的列表,并尝试在未运行的系统上启动该服务。

function process-CSVfile2 {
    param($filename)
    Import-Csv $filename |
    ForEach-Object -PipelineVariable object {
        if($_.Status -eq "Running") {
            Write-Host "Your Service is currently Running on" $_.Computer
        }
        if($_.Status -eq "Stopped") {
            $serviceName = 'my_service'
            $service = Get-CimInstance Win32_Service -ComputerName $_.Computer -Filter "Name=$serviceName"
            $service.Start()
            $service.WaitForStatus("Started",'00:00:30')
            Start-Sleep 10
        }
    }
}

这些块中的一些块是单独运行的,但是放在一起它们将无法运行。我似乎无法越过第二块,它只是一遍又一遍地看着同一条线。

此外还有一篇我一直试图开始工作的应用程序,可以在没有安装服务的系统上安装应用程序,但是这项工作也没有用,但我会在不同的时间保存它。

如果有人能帮助我,我会非常感激。在试图让它运行3天之后,我就在我的智慧结束。

1 个答案:

答案 0 :(得分:0)

我会创建对象和属性,而不是使用在线计算机等文件... 类似的东西:

$Computers=New-Object -TypeName System.Collections.ArrayList
$Servers = @(Get-Content -path c:\servers.txt)
$Servers = $Servers | ? {$_} | select-object -uniqe |ForEach-Object {$_.TrimEnd()}
$Servers|ForEach-Object {
$tempobj=New-Object -TypeName PSObject
$tempobj | Add-Member -type NoteProperty -name Name -value $_
$tempobj | Add-Member -type NoteProperty -name isOnline -value $FALSE
$tempobj | Add-Member -type NoteProperty -name Installed -value $FALSE
$tempobj | Add-Member -type NoteProperty -name serviceRunning -value $FALSE
            [void]$Computers.Add($tempobj)

然后你可以处理数组(不需要额外的文件)

$Computers|Where-Object {$_.isOnline -eq $TRUE}