2013-07-24 99 views
11

我對PowerShell非常陌生,理解起來有些困難。
我想在PowerShell腳本中安裝.MSI
可以請解釋我如何做到這一點或爲我提供初學者級別的教程。如何使用PowerShell安裝.MSI

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

回答

12

爲什麼會這麼喜歡它?只需調用.msi文件:

​​

Start-Process <path>\filename.msi 

編輯:開始處理的全部列表參數

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

+0

你可以簡單地添加開關和其他參數呢? – Brettski

4

您可以使用:

msiexec /i "c:\package.msi" 

您還可以添加更多可選參數。有一些常見的msi參數和參數是您的安裝程序特有的。對於常見參數,請致電msiexec

4

@ Adi的答案中的<path>部分可能會讓一個完全陌生於PowerShell或其他命令shell的人感到困惑。

使用windows GUI查找路徑的值,右鍵單擊.msi文件,選擇'屬性',然後選擇'細節'。在「文件夾路徑」下,您將看到需要寫入的內容。

所以你的命令看起來像(例如)

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

這是有目共睹的誰使用StackOverflow的大多數人,而是一個真正的新手可以很容易誤入歧途。

+0

我重寫了這個,以避免使用相對答案的位置,他們可以隨時更改 – neontapir

+0

謝謝!我現在明白了。 – ngks

+0

像這樣的說明應作爲評論或建議的修改發佈,而不是以不同的方式表達同一事物的新答案。無論如何,我相信任何精通計算機的人都可以首先使用PowerShell,而不會有任何理解這一點的麻煩。我還沒有看到任何人有這種困惑的表示,你會一直看到他們的答案。就我個人而言,我認爲它比你擁有的方式更好。此外,如果.msi不在C:\ Users中,爲什麼不能像您的表示一樣混淆假設的noob? –

6
#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,但終於拼湊起了這個工作腳本。它工作得很好!以爲我會在這裏發佈希望其他人可以受益。它提取計算機列表,將文件複製到本地計算機並運行。 :) 派對!

1
#$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

你必須給你的答案一些意見 – ohlmar

1

一些考驗和磨難之後,我能找到的所有的.msi文件在給定的目錄,並安裝它們。

foreach($_msiFiles in 
($_msiFiles = Get-ChildItem $_Source -Recurse | Where{$_.Extension -eq ".msi"} | 
Where-Object {!($_.psiscontainter)} | Select-Object -ExpandProperty FullName)) 
{ 
    msiexec /i $_msiFiles /passive 
}