我對PowerShell非常陌生,理解起來有些困難。
我想在PowerShell腳本中安裝.MSI
。
可以請解釋我如何做到這一點或爲我提供初學者級別的教程。如何使用PowerShell安裝.MSI
$wiObject = New-Object -ComObject WindowsInstaller.Installer
?????
我對PowerShell非常陌生,理解起來有些困難。
我想在PowerShell腳本中安裝.MSI
。
可以請解釋我如何做到這一點或爲我提供初學者級別的教程。如何使用PowerShell安裝.MSI
$wiObject = New-Object -ComObject WindowsInstaller.Installer
?????
爲什麼會這麼喜歡它?只需調用.msi文件:
或
Start-Process <path>\filename.msi
編輯:開始處理的全部列表參數
您可以使用:
msiexec /i "c:\package.msi"
您還可以添加更多可選參數。有一些常見的msi參數和參數是您的安裝程序特有的。對於常見參數,請致電msiexec
@ Adi的答案中的<path>
部分可能會讓一個完全陌生於PowerShell或其他命令shell的人感到困惑。
使用windows GUI查找路徑的值,右鍵單擊.msi文件,選擇'屬性',然後選擇'細節'。在「文件夾路徑」下,您將看到需要寫入的內容。
所以你的命令看起來像(例如)
& C:\Users\YourName\YourDirectory\filename.msi
這是有目共睹的誰使用StackOverflow的大多數人,而是一個真正的新手可以很容易誤入歧途。
#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,但終於拼湊起了這個工作腳本。它工作得很好!以爲我會在這裏發佈希望其他人可以受益。它提取計算機列表,將文件複製到本地計算機並運行。 :) 派對!
#$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"
}
你必須給你的答案一些意見 – ohlmar
一些考驗和磨難之後,我能找到的所有的.msi文件在給定的目錄,並安裝它們。
foreach($_msiFiles in
($_msiFiles = Get-ChildItem $_Source -Recurse | Where{$_.Extension -eq ".msi"} |
Where-Object {!($_.psiscontainter)} | Select-Object -ExpandProperty FullName))
{
msiexec /i $_msiFiles /passive
}
你可以簡單地添加開關和其他參數呢? – Brettski