Я создаю сценарий для автоматизации сборки и настройки компьютера. Идея состоит в том, что из WDS он получается максимально чистым, автоматически запускает этот сценарий, который проверяет серийный номер, запрашивает нашу базу данных ресурсов Workday и конфигурирует ОС в соответствии с что нужно пользователю, назначенному для этой системы.
Сейчас я сосредоточен на трех больших группах: ноутбук, настольный компьютер и лаборатория. Все 3 будут иметь некоторые SW, которые будут одинаковыми, а некоторые будут специфичными для каждого. Моя проблема с msiexec: изначально я жестко запрограммировал все установки для каждой группы. но это означает, что мне придется менять скрипт каждый раз, когда что-то обновляется (скажем, новое приложение выкатывается по умолчанию). что не идеально.
function Install-Desktop {
#Write-Output "Here will be the install Desktop computer script"
$IPATH="<Path To root sw folder>"
#Software List
<# SOFTWARE LIST #>
$office="$IPATH\script\o365"
$webex="$IPATH\script\webex"
$chrome="$IPATH\script\chrome"
#install Ofice:
Invoke-Expression "$office\setup.exe /configure $office\O365.xml"
$params = '/i', "$webex\webexapp.msi",'/qb!','/norestart'
Start-Process msiexec -ArgumentList "$params" -Wait -PassThru
$params = '/i', "$chrome\GoogleChromeStandaloneEnterprise64.msi",'/qb!','/norestart'
Start-Process msiexec -ArgumentList $params -Wait -PassThru
}
Этот фрагмент кода работает хорошо.
Теперь моя идея заключалась в том, чтобы импортировать из списка устанавливаемое программное обеспечение (поддерживать список проще, чем каждый раз изменять скрипт). что-то вроде:
function install-software {
param (
[String]$Type
)
$IPATH=<ROOT SW Folder>
$SoftWares=Import-Csv -Path "$IPath\script\$Type`.csv" #there will be a Laptop.csv in that path
foreach ($Software in $SoftWares) {
#detect if it is msiexect or other:
# (this has to do with how the csv is built, the first parameter is '/i' if it is an msi installer)
if ($Software.param1 -eq "'/i'") {
Start-Process msiexec -ArgumentList $Software -Wait -PassThru
}
else {
$Params=[string]::Join(" ",$Software.param1,$Software.param2,$Software.param3,$Software.param4)
Invoke-Expression "$Params"
}
}
}
Это работает только для остальной части. Однако на стороне msiexec if MSI открывается как без аргументов. Я пробовал много способов передать аргументы, но ни один из них не сработал. Я ни в коем случае не гуру PowerShell, поэтому, возможно, мне чего-то не хватает здесь.