使用Powershell从列表安装软件

时间:2019-06-21 18:43:03

标签: powershell automation windows-installer

我正在构建一个脚本来自动执行计算机构建和配置:想法是从WDS尽可能简洁地开始,它会自动运行此脚本,该脚本将检查序列号,查询资产的工作日数据库并根据操作系统进行配置分配给该系统的用户需要什么。

现在,我主要关注3个大类:笔记本电脑,台式机和实验室。所有3个将具有相同的SW,并且每个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" 
        }
    }
}

这仅适用于else部分。但是,在if的msiexec端,MSI会以不带参数的形式打开。我尝试了很多方法来传递args,但没有一个起作用。无论如何,我都不是PowerShell专家,所以这里可能缺少我想要看到的东西。

1 个答案:

答案 0 :(得分:1)

好吧,看来您必须通过完整路径,甚至不让您使用挂载的网络驱动器:因此答案就在csv上。而不是S:\ << em>安装程序的路径>,它必须是\ << em>安装程序的完整路径>,我也必须删除所有引号和双引号