Silent Setup mittels Powershell ausführen
Hallo,
Ich komm irgendwie nicht voran.
Ich möchte gern ein Setup automatisiert laufen lassen. Das soll komplett automatisch passierern (im späteren Verlauf). Aktuell geht es erstmal darum, dass der Aufruf überhaupt funktioniert. Das Setup läuft auf vielen verschiedenen Systemen und installiert eine Software. Diese Software beinhaltet diverse Schnittstellen, die als Windows Service installiert werden.
Da das von Server zu Server imme andere Services in Name und Anzahl sind, hatte ich überlegt, alle Services in eine ini-Datei aufzulisten und die Services auszukommentieren, die nicht installiert werden soll. Das Powershell Script, was das Setup ausführt, soll nun in dieseini-Datei reinschauen und die nicht auskommentierten Services als Parameter übernhemen und an den Installationsbefehl anhängen.
Und an dieser Stelle denke ich irgendwie zu verquer und weiß nicht, wie ich das Ganze angehen soll.
Die Ini-Datei soll quasi folgendermaßen ausshen:
Diesen Aufruf hab ich von einem Programmentwickler bekommen:
Hinter dem /sil müssten dann also die nicht auskommentierten Services aus der ini-Datei automatisch eingefügt werden
So gehts dann weiter:
Ich komm irgendwie nicht voran.
Ich möchte gern ein Setup automatisiert laufen lassen. Das soll komplett automatisch passierern (im späteren Verlauf). Aktuell geht es erstmal darum, dass der Aufruf überhaupt funktioniert. Das Setup läuft auf vielen verschiedenen Systemen und installiert eine Software. Diese Software beinhaltet diverse Schnittstellen, die als Windows Service installiert werden.
Da das von Server zu Server imme andere Services in Name und Anzahl sind, hatte ich überlegt, alle Services in eine ini-Datei aufzulisten und die Services auszukommentieren, die nicht installiert werden soll. Das Powershell Script, was das Setup ausführt, soll nun in dieseini-Datei reinschauen und die nicht auskommentierten Services als Parameter übernhemen und an den Installationsbefehl anhängen.
Und an dieser Stelle denke ich irgendwie zu verquer und weiß nicht, wie ich das Ganze angehen soll.
Die Ini-Datei soll quasi folgendermaßen ausshen:
Service1
Service2
Service3
Service4
Service5
Service6
Service7
...
...
...
Service 19
Diesen Aufruf hab ich von einem Programmentwickler bekommen:
#Setup auf dem Server starten (Silent, Checksum nicht checken, Zielverzeichnis)
[String]$PathOnServer = -join("D:", $LocalPath)
[String]$arguments = -join(" /S /NCRC /INSTDIR=`"", $PathOnServer, "`"", " /sil /<Service1> /<Service4> /<Service usw>")
[String]$FullCommand = -join($PathOnServer, $SetupFilename, $arguments)
So gehts dann weiter:
Write-Host (-join(" Starte ", $FullCommand))
#Opens a batch file process on Remote Computer using Invoke-WMIMethod
$process = Invoke-WMIMethod -Class Win32_Process -Name Create -Computername $ServerName -ArgumentList $FullCommand
if ($process.ReturnValue -eq 0)
{
$processId = $process.ProcessId
#Installation abwarten und maximal 5 Minuten warten
$runningCheck = { Get-WmiObject -Class Win32_Process -Filter "ProcessId='$processId'" -ComputerName $ServerName -ErrorAction SilentlyContinue }
while ($null -ne (& $runningCheck))
{
Start-Sleep -m 500
}
#Zur Sicherheit noch 1 Sekunde warten
Start-Sleep -s 1
}
else
{
Write-Host ("Installieren von", $SetupFilename, "auf", $ServerName, "ist fehlgeschlagen.") -ForegroundColor "red"
$global:FailedInstalls += $ServerName
}
checkReturnCode -join("Installieren auf ", $ServerName, " ist fehlgeschlagen.") $process.ExitCode
#Setup-File löschen
deleteFile $TargetFile
# Aufräumen
silentDeleteFile "err.txt"
silentDeleteFile "out.txt"
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4968944185
Url: https://administrator.de/contentid/4968944185
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
9 Kommentare
Neuester Kommentar
Moin,
Auskommentieren heisst mit führender Raute? Dann So:
tio.run
Gruß Thomas
Zitat von @MarciMarc85:
Und an dieser Stelle denke ich irgendwie zu verquer und weiß nicht, wie ich das Ganze angehen soll.
Die Ini-Datei soll quasi folgendermaßen ausshen:
...
Hinter dem /sil müssten dann also die nicht auskommentierten Services aus der ini-Datei automatisch eingefügt werden
Da die Variable $arguments als Typ [string] deklariert ist, kannst du dir den join sparen. Bei der Umwandlung von Arrays in den Type String, werden alle Elemente immer automatisch mit Leerzeichen verbunden.Und an dieser Stelle denke ich irgendwie zu verquer und weiß nicht, wie ich das Ganze angehen soll.
Die Ini-Datei soll quasi folgendermaßen ausshen:
Service1
Service2
Service3
Service4
Service5
Service6
Service7
...
[String]$arguments = -join(" /S /NCRC /INSTDIR=`"", $PathOnServer, "`"", " /sil /<Service1> /<Service4> /<Service
Auskommentieren heisst mit führender Raute? Dann So:
[String]$arguments = " /S /NCRC /INSTDIR=""$PathOnServer"" /sil "+
(Select-String -NotMatch "^#" -Path <Pfad zur Ini>).Foreach({"/"+$_.Line})
tio.run
Gruß Thomas
Moin Marc,
mit Powershell und ein bisschen RegEx ist fast alles so einfach möglich
tio.run
Gruß Thomas
mit Powershell und ein bisschen RegEx ist fast alles so einfach möglich
$ini = "C:\Pfad\zur\services.ini"
$arguments = " /S /NCRC /INSTDIR=""$PathOnServer"" /sil "
$arguments += Foreach ($Service in Select-String -Pattern '^(?!#)([^ ]+)( /man)?' -Path $ini) {
# Service zu Argumenten hinzufügen
"/"+$Service.Matches.Groups[1].Value
# Wenn hinter Service "/man", Starttyp auf manuell festlegen
if ($Service.Matches.Groups[2].Success) {
Set-Service -Name $Service.Matches.Groups[1].Value -StartupType Manual
}
} # Ende Foreach $Service
tio.run
Gruß Thomas
Zitat von @MarciMarc85:
In der Ini steht z.b. Service1. Durch diesen Parameter wird der Service mit dem Namen "App Service 1" un der ausführbaren Datei Service1.exe installiert. Mit dem Befehl zum setzten des Startmodus auf manuell benötige ich demnach den Anzeigenamen als Variable
Ok. Ich gehe mal davon aus, die Services können erst nach dem eigentlichen Setup auf manuell gesetzt werden, da sie vorher noch gar nicht existieren, richtig?In der Ini steht z.b. Service1. Durch diesen Parameter wird der Service mit dem Namen "App Service 1" un der ausführbaren Datei Service1.exe installiert. Mit dem Befehl zum setzten des Startmodus auf manuell benötige ich demnach den Anzeigenamen als Variable
Versuche mal folgendes:
$ini = "C:\Pfad\zur\services.ini"
$arguments = " /S /NCRC /INSTDIR=""$PathOnServer"" /sil "
$arguments += Foreach ($Service in Select-String -Pattern '^(?!#)([^ ]+)( /man)?' -Path $ini) {
# Service zu Argumenten hinzufügen
"/"+$Service.Matches.Groups[1].Value
# Wenn hinter Service "/man", Starttyp auf manuell festlegen
if ($Service.Matches.Groups[2].Success) {
[Array]$startManual += $Service.Matches.Groups[1].Value
}
} # Ende Foreach $Service
# Setupprozess
# ...
$Services = gcim Win32_Service
Foreach ($Service in $startManual) {
$Services | ? PathName -like "*$Service*" |%{Set-Service -Name $_.Name -StartupType Manual}
}
Danke gleichfalls.