Нужна помощь в написании скрипта на PowerShell для автоматизации тихой установки Avamar Client на нескольких компьютерах.

Вопрос или проблема

Я пишу скрипт на Powershell для автоматизации тихой установки Avamar Client на нескольких машинах.

Вот скрипт, который я написал, но он продолжает выдавать ошибки:

#Переменные
$computername=Get-Content C:PSdeploy\list.txt
$sourcefile= "\\mydomain.org\public\AvamarClient-windows-x86_64-7.1.100-370.msi"
$credentials = Get-Credential
#Этот раздел установит программное обеспечение
foreach ($computer in $computername)
{
    $destinationFolder = "\\$computer\C$\Temp"
    #Этот раздел скопирует $sourcefile в $destinationFolder. Если папка не существует, она будет создана.
    if (!(Test-Path -path $destinationFolder))
    {
        New-Item $destinationfolder -Type Directory
    }
    Copy-Item -Path $sourcefile -Destination $destinationFolder
    Invoke-Command -ComputerName $computer -ScriptBlock {Start-Process 'c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi' -ArgumentList msiexec /I} -credential $creds
}

Вот ошибка, которую я получаю:

PS C:\Users\n1254937> C:\Users\myuserid\Desktop\AvamarClient remote install.ps1
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
A positional parameter cannot be found that accepts argument '/I'.
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
    + PSComputerName        : test.mydomain.org

Что я делаю не так?

Определение для -ArgumentList это <String[]>, что является массивом строк.

Как есть, это воспринимается как -ArgumentList msiexec, за которым следует /I, что не является допустимым аргументом для Start-Process.

Чтобы указать несколько аргументов, необходимо предоставить их в виде массива строк, который можно записать в виде списка, разделенного запятыми, в PowerShell. Так что для указания двух аргументов вы бы использовали -ArgumentList 'msiexec','/I'.

Сказав это, я не думаю, что это сработает даже если вы внесете это исправление. В текущем виде, вы говорите ему запускать .MSI файл, и передаете этому файлу два аргумента: msiexec и /I.

То, что вы должны стремиться сделать, это запустить msiexec, указав .MSI файл и /I в качестве аргументов для msiexec.

Так что попробуйте что-то типа:

{Start-Process 'msiexec' -ArgumentList 'c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi','/I'}

Или просто:

{Start-Process 'msiexec' 'c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi','/I'}

…так как -ArgumentList фактически является опциональным (как и -FilePath).

Ответ или решение

Конечно, давайте разберёмся с вопросом автоматизации тихой установки Avamar Client на нескольких машинах с помощью скрипта на PowerShell.

Обзор проблемы

Ваш текущий скрипт сталкивается с проблемой неправильно переданных аргументов в команду Start-Process. Ошибка появляется из-за того, что аргументы передаются как один объединенный блок текста, а не как массив строк, что приводит PowerShell к неправильной интерпретации команды.

Решение

Оптимизация вашего скрипта заключается в корректной передаче аргументов msiexec. Вам нужно запускать сам msiexec.exe, передавая ему в качестве аргументов путь к .MSI файлу и инструкцию /I для установки.

Правильный скрипт

Следующая версия скрипта исправляет проблемы и позволяет автоматизировать установку с использованием переданных учётных данных:

# Переменные
$computername = Get-Content "C:\PSdeploy\list.txt"
$sourcefile = "\\mydomain.org\public\AvamarClient-windows-x86_64-7.1.100-370.msi"
$credentials = Get-Credential

# Установка программного обеспечения
foreach ($computer in $computername) {
    $destinationFolder = "\\$computer\C$\Temp"

    # Проверка существования папки и её создание при необходимости
    if (!(Test-Path -Path $destinationFolder)) {
        New-Item -Path $destinationFolder -Type Directory
    }

    # Копирование файла на удалённый компьютер
    Copy-Item -Path $sourcefile -Destination $destinationFolder -Credential $credentials

    # Запуск установки с использованием Invoke-Command
    Invoke-Command -ComputerName $computer -ScriptBlock {
        Start-Process -FilePath "msiexec.exe" -ArgumentList "/i c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi /quiet /norestart" -Wait
    } -Credential $credentials
}

Объяснение изменений

  1. Передача аргументов: Вместо Start-Process с одним строковым аргументом, мы используем массив строк в виде -ArgumentList "/i c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi /quiet /norestart". Это позволяет правильно передать команды msiexec.

  2. Пути: Обратите внимание на правильное использование путей, используя переменные и корректное расширение путей для удаленных машин.

  3. Тихая установка: Опция /quiet позволяет выполнять установку без взаимодействия с пользователем, что идеально подходит для автоматизации. Параметр /norestart предотвращает автоматическую перезагрузку после установки.

  4. Учётные данные: Убедитесь, что у вас есть необходимые привилегии для установки ПО на удалённых машинах.

Этот скрипт соответствует профессиональным стандартам и эффективно разрешает исходную проблему. Следуя таким подходам, вы сможете успешно автоматизировать процесс развертывания Avamar Client.

Оцените материал
Добавить комментарий

Капча загружается...