web-dev-qa-db-ja.com

PowerShellを使用して.MSIをインストールする方法

私はPowerShellを初めて使用するので、理解するのが多少困難です。
PowerShellスクリプト内に.MSIをインストールしたい。
その方法を説明したり、初心者レベルのチュートリアルを教えてください。

$wiObject = New-Object -ComObject WindowsInstaller.Installer
?????
15
New Developer

なぜそんなに夢中になりますか? .msiファイルを呼び出すだけです:

& <path>\filename.msi

または

Start-Process <path>\filename.msi

編集:Start-Processパラメーターの全リスト

https://ss64.com/ps/start-process.html

15
Adi Inbar
#Variables
$computername = Get-Content 'M:\Applications\Powershell\comp list\Test.txt'
$sourcefile = "\\server\Apps\LanSchool 7.7\Windows\Student.msi"
#This section will install the software 
foreach ($computer in $computername) 
{
    $destinationFolder = "\\$computer\C$\download\LanSchool"
    #This section will copy the $sourcefile to the $destinationfolder. If the Folder does not exist it will create it.
    if (!(Test-Path -path $destinationFolder))
    {
        New-Item $destinationFolder -Type Directory
    }
    Copy-Item -Path $sourcefile -Destination $destinationFolder
    Invoke-Command -ComputerName $computer -ScriptBlock { & cmd /c "msiexec.exe /i c:\download\LanSchool\Student.msi" /qn ADVANCED_OPTIONS=1 CHANNEL=100}
}

私はこれを自分自身で検索し、zilchを思いつきましたが、最終的にこの作業スクリプトをまとめました。うまくいっています!私はここに投稿したいと思っていましたが、うまくいけば他の誰かが恩恵を受けることができます。コンピューターのリストを取得し、ファイルをローカルマシンにコピーして実行します。 :)パーティーに!

6
bonedog73

PowerShellや他のコマンドシェルを初めて使用する人は、<path> @Adiの回答の一部。

windows GUIを使用してパスの値を見つけるには、.msiファイルを右クリックし、「プロパティ」、「詳細」の順に選択します。 「フォルダパス」の下に、何を書く必要があるかが表示されます。

コマンドは次のようになります(たとえば)

& C:\Users\YourName\YourDirectory\filename.msi

これはStackOverflowを使用するほとんどの人には明らかですが、真の初心者は簡単に迷う可能性があります。

5
ngks

次のコマンドを使用して、PowerShell経由でMSIをサイレントインストールしようとする場合:

Start-Process $webDeployInstallerFilePath -ArgumentList '/quiet' -Wait

エラーが発生していました:

指定された実行可能ファイルは、このOSプラットフォームの有効なアプリケーションではありません。

代わりにmsiexec.exeを使用してこのコマンドでMSIを実行するように切り替えたところ、期待どおりに機能しました。

$arguments = "/i `"$webDeployInstallerFilePath`" /quiet"
Start-Process msiexec.exe -ArgumentList $arguments -Wait

うまくいけば、他の人がこれが役立つと思います。

5
deadlydog

次を使用できます。

msiexec /i "c:\package.msi"

オプションのパラメーターをさらに追加することもできます。一般的なmsiパラメーターと、インストーラーに固有のパラメーターがあります。一般的なパラメーターについては、msiexecを呼び出すだけです

4
Andrey Marchuk

試行錯誤の後、特定のディレクトリですべての.msiファイルを見つけてインストールすることができました。

foreach($_msiFiles in 
($_msiFiles = Get-ChildItem $_Source -Recurse | Where{$_.Extension -eq ".msi"} |
 Where-Object {!($_.psiscontainter)} | Select-Object -ExpandProperty FullName)) 
{
    msiexec /i $_msiFiles /passive
}
1
micsea64
#$computerList = "Server Name"
#$regVar = "Name of the package "
#$packageName = "Packe name "
$computerList = $args[0]
$regVar = $args[1]
$packageName = $args[2]
foreach ($computer in $computerList)
{
    Write-Host "Connecting to $computer...."
    Invoke-Command -ComputerName $computer -Authentication Kerberos -ScriptBlock {
    param(
        $computer,
        $regVar,
        $packageName
        )

        Write-Host "Connected to $computer"
        if ([IntPtr]::Size -eq 4)
        {
            $registryLocation = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\"
            Write-Host "Connected to 32bit Architecture"
        }
        else
        {
            $registryLocation = Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
            Write-Host "Connected to 64bit Architecture"
        }
        Write-Host "Finding previous version of `enter code here`$regVar...."
        foreach ($registryItem in $registryLocation)
        {
            if((Get-itemproperty $registryItem.PSPath).DisplayName -match $regVar)
            {
                Write-Host "Found $regVar" (Get-itemproperty $registryItem.PSPath).DisplayName
                $UninstallString = (Get-itemproperty $registryItem.PSPath).UninstallString
                    $match = [RegEx]::Match($uninstallString, "{.*?}")
                    $args = "/x $($match.Value) /qb"
                    Write-Host "Uninstalling $regVar...."
                    [diagnostics.process]::start("msiexec", $args).WaitForExit() 
                    Write-Host "Uninstalled $regVar"
            }
        }

        $path = "\\$computer\Msi\$packageName"
        Write-Host "Installaing $path...."
        $args = " /i $path /qb"
        [diagnostics.process]::start("msiexec", $args).WaitForExit()
        Write-Host "Installed $path"
    } -ArgumentList $computer, $regVar, $packageName
Write-Host "Deployment Complete"

}
1
sumit