Отличная вещь, которая всегда нужна — адресный деплойер msi-пакетов на удалённых хостах.
Украшательствами данного скрипта я не занимался умышленно — так как запускаю его в среде PowerShell ISE от имени администратора.
Всю основу скрипта сложил в функцию install. Принцип работы функции заключается в копировании на админскую шару C$ установочного пакета и вызова его через Invoke-Command. По итогам работы будет выведен код выхода. Если код выхода равен нулю — значит всё прошло отлично и будет получено сообщение «Установка прошла успешно!«
При ином исходе будет выведен код выхода. Дальше думайте сами в чём проблема!
Логика работы проста: для начала правим значение переменной $install, запускаем, скрипт спросит имя удалённого хоста, на котором нужно развернуть пакет. Если хост пингуется — скрипт вызовет функцию, в противном случае получим сообщение «Хост $hostname не отвечает!»
# Блок переменных #
$hostname = Read-Host "Имя компьютера"
$install = "\\ip\files\distrib\soft.msi"
$ping = Test-Connection -ComputerName $hostname -Quiet -Count 1
$output = "\\$hostname\C$\install.msi"
# Функция установки #
function install
{
Set-Service -ComputerName $hostname -Name WinRM -Status Running -PassThru | Out-Null
Copy-Item -Path $install -Destination $output -PassThru | Out-Null
$exitcode = Invoke-Command -ComputerName $hostname -ScriptBlock { (Start-Process -FilePath C:\install.msi -ArgumentList "/quiet" -Wait -PassThru).ExitCode }
if ($exitcode -eq 0) { Write "Установка прошла успешно!" }
else { Write "Код выхода:" $exitcode }
Remove-Item $output -Force | Out-Null
}
# Проверка доступности хоста #
if ($ping) { install }
else { Write "Хост $hostname не отвечает!" }
Если необходимо запускать скрипт вне среды PowerShell ISE добавьте в основании скрипта Read-Host, чтобы скрипт ожидал действия пользователя. Так скрипт не будет закрываться и можно будет мониторить коды выхода.