Vorrei installare una serie di applicazioni: .NET 4, snap-in, ASP.NET MVC 3, ecc. Come si ottengono le applicazioni da installare e restituire un valore che determina se l'installazione è stata eseguita correttamente o no?Come si esegue un programma di installazione di Windows e si ottiene un valore di esito positivo/negativo in PowerShell?
risposta
Depends. Gli MSI possono essere installati usando WMI. Per gli ex e altri metodi, è possibile utilizzare Start-Process e controllare il Process ExitCode.
MSI può anche essere installato utilizzando msiexec.exe, MSU di può essere installato utilizzando wusa.exe, entrambi hanno un interruttore /quiet
, /norestart
e /forcerestart
interruttori e un'opzione /log
per la registrazione (specificare il nome del file).
Si può leggere di più sulle opzioni se li chiami con /?
Nota: wusa fallisce silenziosamente quando non riescono, quindi bisogna controllare il file di log o registro eventi per determinare il successo.
Ho implementato esattamente quello che stai cercando nel mio progetto attuale. Dobbiamo automatizzare la distribuzione e l'instillazione di n numero di app in più ambienti e data center. Questi script sono leggermente modificati dalla versione originale per motivi di semplicità poiché il mio codice completo raggiunge le 1000 linee ma la funzionalità di base è intatta. Spero che questo faccia quello che stai chiedendo.
Questa funzione PS estrae tutte le app dal registro (da che cosa si aggiungono/rimuovono i programmi), quindi cerca il nome dell'app fornito e visualizza la versione. Nel mio codice (PSM1) eseguo questa funzione prima di installare o meno i loro e poi afterword per verificare che sia stata installata .... Tutto ciò può essere avvolto in una funzione principale per controllare il flusso del gestore.
function Confirm-AppInstall{
param($AppName,$AppVersion)
$Apps = Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*|?{$_.DisplayName -ne $Null}|?{$_.DisplayName -ne ""}
$Apps += Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*|?{$_.DisplayName -ne $Null}|?{$_.DisplayName -ne ""}
$Installed = $Apps|?{$_.DisplayName -eq ""}|?{$_.DisplayVersion -eq ""}|select -First 1
if($Installed -ne $null){return $true}else{return $false}
}
Questa funzione PS caricherà un file txt con i comandi di installazione prepopolati (un comando per riga). ed esegui ogni riga indivaduly ed aspetti l'installazione per completare prima di passare al seguente.
function Install-Application{
param($InstallList = "C:\Install_Apps_CMDS.txt")
$list = gc -Path $InstallList
foreach ($Command in $list){
Write-Output ("[{0}]{1}" -f (Get-Date -Format G),$call)
#Make install process wait for exit before continuing.
$p = [diagnostics.process]::Start("powershell.exe","-NoProfile -NoLogo -Command $Command")
$p.WaitForExit()
Start-Sleep -Seconds 2
#Searches for the installer exe or msi that was directly opened by powershell and gets the process id.
$ProcessID = (gwmi -Query ("select ProcessId from Win32_Process WHERE ParentProcessID = {0} AND Name = '{1}'" -f $p.Id,$ParentProcessFile)|select ProcessId).ProcessId
#waits for the exe or msi to finish installing
while ((Get-Process -Id $ProcessID -ea 0) -ne $null){
Start-Sleep -Seconds 2
$ElapsedTime = [int](New-TimeSpan -Start $P.StartTime -End (Get-Date)|select TotalSeconds).TotalSeconds
#install times out after 1000 seconds so it dosent just sit their forever this can be changed
if(2000 -lt $ElapsedTime){
Write-Output ('[{0}] The application "{1}" timed out during instilation and was forcfully exited after {2} seconds.' -f (Get-Date -Format G),$App.Name,(([int]$App.InstallTimeOut) * 60))
break
}
}
#clean up any old or hung install proccess that should not be running at this point.
Stop-Process -Name $ParentProcessName -ea 0 -Force
Stop-Process -Name msiexec -ea 0 -Force
}
}
Il file TXT deve essere formattato come tale ... dovrete fare voi ricerca su come ogni applicazione ha bisogno di essere installato. una buona risorsa è appdeploy.com
C:\Install.exe /q
C:\install.msi /qn TRANSFORMS='C:\transform.mst'
C:\install2.msi /qn /norestart
C:\install3.exe /quiet
Fatemi sapere se ci sono errori che ho dovuto modificare il mio codice esistente per rimuovere i valori di proprietà e rendere questo un po 'più semplice. Sto estrapolando i miei valori da un foglio di risposta XML personalizzato. Ma questo codice dovrebbe funzionare come l'ho fornito.
Se desideri discutere di più sulla mia implementazione fammi sapere e posso fare una spiegazione più dettagliata e aggiungere anche altre funzioni di supporto che ho implementato.
Queste risposte sembrano tutte eccessivamente complicate o non sufficientemente complete. L'esecuzione di un programma di installazione nella console di PowerShell presenta alcuni problemi. Un MSI viene eseguito nel Windows subsystem, quindi non è possibile richiamarli (Invoke-Expression
o &
). Alcune persone sostengono di far funzionare quei comandi tramite piping a Out-Null
o Out-Host
, ma non l'ho osservato per funzionare.
Il metodo che funziona per me è Start-Process
con i parametri di installazione non presidiati su msiexec
.
$list =
@(
"/I `"$msi`"", # Install this MSI
"/QN", # Quietly, without a UI
"/L*V `"$ENV:TEMP\$name.log`"" # Verbose output to this log
)
Start-Process -FilePath "msiexec" -ArgumentList $list -Wait
È possibile ottenere il exit code dal comando Start-Process
ed esaminarlo per pass/fail valori. (ed ecco lo exit code reference)
$p = Start-Process -FilePath "msiexec" -ArgumentList $list -Wait -PassThru
if($p.ExitCode -ne 0)
{
throw "Installation process returned error code: $($p.ExitCode)"
}
- 1. Come si esegue un programma esterno in node.js su Windows?
- 2. Come si imposta il percorso di installazione predefinito con un programma di installazione di Windows?
- 3. Come si esegue un programma Python?
- 4. Come si ottiene l'output di questo programma?
- 5. Come si esegue correttamente la versione di un programma?
- 6. Come si installa un servizio Windows C# senza creare un programma di installazione?
- 7. Come si esegue Vim in Windows?
- 8. Come si ottiene un percorso file senza estensione in PowerShell?
- 9. Come si ottiene l'indice di un articolo in un array?
- 10. Perché 7zip ignora il mio InstallPath quando si esegue un programma di installazione SFX?
- 11. Come si esegue il debug di un programma C su Windows?
- 12. Come si ottiene la directory di IIS predefinita in un pacchetto di installazione di Wix?
- 13. Come si esegue un programma C++ in XCode 4?
- 14. Come creare un programma di installazione per un bundle HWA di Windows 10?
- 15. Come si ottiene un valore specifico da un oggetto System.Data.DataTable?
- 16. come creare il programma di installazione in un altro programma di installazione?
- 17. Come si aggiunge un Contratto di licenza a un programma di installazione dell'applicazione AIR?
- 18. Come si ottiene l'ID di processo di un programma in Unix o Linux usando Python?
- 19. Come si crea un programma di installazione di aggiornamento con NSIS?
- 20. risultato strano quando si esegue un programma come una radice
- 21. Come si programma un effetto "flash" quando si aggiornano le caselle di testo in un modulo di Windows con C#?
- 22. Come si esegue una query di SQL Server da PowerShell?
- 23. Come si esegue un programma java da una directory diversa?
- 24. Come si esegue l'aritmetica in un makefile?
- 25. Come si esegue un programma da riga di comando in Delphi?
- 26. Come si ottiene il tipo di valore in Scheme?
- 27. Il programma di installazione NodeJS non si apre su Vista
- 28. Installazione di un servizio topshelf tramite PowerShell
- 29. Come posso creare un programma di installazione WiX 3.5 con un programma di installazione di .NET 4.0 completamente autonomo?
- 30. PowerShell ottiene un elenco di macchine di rete