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"
}
}
我希望有人可以帮助我编写以下脚本: 我构建的脚本适用于 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"
}
}