使用Powershell从列表中安装软件

使用Powershell从列表中安装软件,powershell,automation,windows-installer,Powershell,Automation,Windows Installer,我正在构建一个自动化计算机构建和配置的脚本:其思想是,从WDS中,它尽可能干净,自动运行该脚本,该脚本将检查序列号,查询资产的Workday数据库,并根据分配给该系统的用户需要配置操作系统 现在我主要关注三大类:笔记本电脑、台式机和实验室。所有三类软件都有一些相同的软件,有些软件针对每一类。我的问题是msiexec:最初,我硬编码了每个组的所有安装。但这意味着每次更新时我都必须更改脚本(比如,一个新的应用程序作为默认应用程序推出)。这并不理想 function Install-Deskt

我正在构建一个自动化计算机构建和配置的脚本:其思想是,从WDS中,它尽可能干净,自动运行该脚本,该脚本将检查序列号,查询资产的Workday数据库,并根据分配给该系统的用户需要配置操作系统

现在我主要关注三大类:笔记本电脑、台式机和实验室。所有三类软件都有一些相同的软件,有些软件针对每一类。我的问题是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
    }
功能安装桌面{
#写入输出“这将是安装桌面计算机脚本”
$IPATH=“”
#软件清单
$office=“$IPATH\script\o365”
$webex=“$IPATH\script\webex”
$chrome=“$IPATH\script\chrome”
#安装Ofice:
调用表达式“$office\setup.exe/configure$office\O365.xml”
$params='/i'、“$webex\webexapp.msi”、'/qb!'、'/norestart'
启动进程msiexec-参数列表“$params”-等待-传递
$params='/i',“$chrome\googlechromestandaloneterprise64.msi”,“/qb!”,“/norestart”
启动进程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" 
        }
    }
}
功能安装软件{
param(
[字符串]$Type
)
$IPATH=
$SoftWares=Import Csv-路径“$IPath\script\$Type`.Csv”#该路径中将有一个Laptop.Csv
foreach($软件中的软件){
#检测它是msiexect还是其他:
#(这与csv的构建方式有关,如果是msi安装程序,则第一个参数为“/i”)
如果($Software.param1-eq“'/i'”){
启动进程msiexec-ArgumentList$Software-Wait-PassThru
}
否则{
$Params=[string]::Join(“,$Software.param1,$Software.param2,$Software.param3,$Software.param4)
调用表达式“$Params”
}
}
}

这只适用于其他部分。但是,在if的msiexec端,MSI将以不带参数的方式打开。我尝试了很多方法通过ARG考试,但都没有成功。无论如何,我都不是PowerShell大师,所以这里可能缺少一些东西

看起来你必须通过完整路径,它甚至不允许你使用挂载的网络驱动器:所以答案就在csv上。而不是S:\它必须是\并且我必须去掉所有的引号和双引号。

不太熟悉通过PS部署MSI,但我的猜测是,由于您将
$params
作为一个数组传递,MSI调用不会看到所有的引号和双引号。如果将
$params
设置为一个字符串,如
$params=“/i$webex\webexapp.msi/qb!/norestart”,会有什么区别吗?另外,您是否尝试过在
foreach`处单步浏览代码以查看
$Software
$Softwares
的值?是的
-ArgumentList
需要作为数组传递(我尝试将它们作为单个字符串传递,但失败了)或单个字符串(但只有一个参数),这将使其非静默。array$软件具有它必须具有的值(我测试它编写变量,而不是执行任何操作)