Ping 并为多台 PC 安装应用程序

Ping and Install applications for multiple PCs

我希望有人可以帮助我编写以下脚本: 我构建的脚本适用于 1 台计算机。它要求用户输入计算机名,它会检查计算机是否在线,如果在线则复制并安装应用程序。

现在,我想添加另一个功能。我希望用户创建一个包含所有计算机名称的 TXT 文件(逐行)并将它们保存在计算机中的某个位置。用户将 运行 脚本,然后 Windows 资源管理器将打开并请求 TXT 文件的位置。因此,脚本将收集该数据(我可能错了,但我应该为此使用数组吗?)从那里,我假设 ForEach 语句应该正确吗?

最困难的(对我来说)部分是...如果计算机离线,它会跳过那台计算机,然后去下一台...当它到达行尾时,它应该去回到第一行并检查计算机(离线)是否在线。棘手的部分是......如果计算机已经安装了该应用程序,它应该跳过它,并继续保持 ping 计算机等。我希望脚本 运行 直到有人手动停止它,将应用程序安装到所有 pc,或者 运行s 3 天。

这可能要求太多,但是...如果能看到所有已成功安装该应用程序的计算机的报告(我相信这应该在 ForEACH 部分)。

谢谢大家

function HarvesterMenu {

$PCName = read-host -Prompt "Enter the computer name"
$PCName = $PCName -replace '(^\s+|\s+$)','' -replace '\s+',' '
$pingPC = Test-Connection -ComputerName $PCName -Quiet -Count 1 -ErrorAction SilentlyContinue

if ($pingPC -eq $True) {
    Write-host "ONLINE"
    harvesterInstall($PCName)
}
else {
    Write-host "OFFLINE"
}
}

function HarvesterInstall($InstallOnPC) {
    
    $Sourcefile = "\SERVER1\discovery03$\HarvesterRemote.msi"
    Copy-Item -Path $Sourcefile -Destination "\$InstallOnPC\c$\windows\temp\HarvesterRemote.msi"
    Invoke-Command -ComputerName $InstallOnPC -ScriptBlock {
        Start-Process c:\windows\temp\HarvesterRemote.msi -ArgumentList "/quiet" -Wait
    }
    Start-Sleep 3

    $InstCompleted = Test-Path -Path '\$InstallOnPC\C$\Program Files (x86)\Labs\Harvester Remote\Harvester\Harvester.exe'

    Write-Host $InstCompleted
    if ($InstCompleted -eq $True) {
        Write-host "Harvester was successfuly installed on $InstallOnPC"
    }
    else {
        Write-host "Something went wrong.  Ping the server and try again"
    }
    
    $BacktoMenu = read-host -Prompt "Press Y to go back to the Main Menu or N to exist"
    if ($backtoMenu -eq "y") {
        harvesterMenu
    }
    else {
        Exit
    }
}

HarvesterMenu

您可以使用 Foreach-Loop 轻松做到这一点。

您需要一个包含您要安装该应用程序的电脑的文件。可能是 .txt 或 .csv 然后你可以在 foreach 中解决它。

类似的东西:

$InputFile = 'C:\Temp\lIST.csv'
$addresses = get-content $InputFile     
        foreach($address in $addresses) {
                if (test-Connection -ComputerName $address -Count 1 -Quiet ) {  
                    write-Host "$address Online"

                    #ur harvesterinstall

                    } 
                    else 
                    { 
                    Write-Warning "$address Offline"

                    }  
        }