Вопрос или проблема
Я пишу скрипт на 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
}
Объяснение изменений
-
Передача аргументов: Вместо
Start-Process
с одним строковым аргументом, мы используем массив строк в виде-ArgumentList "/i c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi /quiet /norestart"
. Это позволяет правильно передать командыmsiexec
. -
Пути: Обратите внимание на правильное использование путей, используя переменные и корректное расширение путей для удаленных машин.
-
Тихая установка: Опция
/quiet
позволяет выполнять установку без взаимодействия с пользователем, что идеально подходит для автоматизации. Параметр/norestart
предотвращает автоматическую перезагрузку после установки. -
Учётные данные: Убедитесь, что у вас есть необходимые привилегии для установки ПО на удалённых машинах.
Этот скрипт соответствует профессиональным стандартам и эффективно разрешает исходную проблему. Следуя таким подходам, вы сможете успешно автоматизировать процесс развертывания Avamar Client.