Verschachtelte IF Abfrage Powershell
Hallo Zusammen,
habe ein Programm, das es in verschiedenen Versionen gibt...
4.5.0
4.5.3
4.6.2
4.6.3
Das Programm soll überall auf 4.6.3 hochgepached werden.
Nun möchte ich eine Fallabfrage mit IF machen, also wenn 4.5.0. installiert ist, starte install.exe 4.5.3, wenn 4.5.3 installiert ist Starte 4.6.2 usw..
Die version wird über eine .ini Datei herausgelesen und in eine .txt geschrieben.
Habe folgenden Skript bisher gebastelt:
IF($TxtFile=4.5.0) {Start-Process "C:\update-v4.5.0-v4.5.3.exe"}
elseif($TxtFile = 4.5.3) {Start-Process "C:\update-v4.5.3-v4.6.2.exe"}
elseif($TxtFile = 4.6.2) {Start-Process "C:\update-v4.6.2-v4.6.3.exe"}
else {Write-Host "Update-Finish"}
Der Skript zeigt mir kein Fehler...aber starten tut er auch nix
Bitte um Hilfe
Vielen Dank
VG
Hanuta
habe ein Programm, das es in verschiedenen Versionen gibt...
4.5.0
4.5.3
4.6.2
4.6.3
Das Programm soll überall auf 4.6.3 hochgepached werden.
Nun möchte ich eine Fallabfrage mit IF machen, also wenn 4.5.0. installiert ist, starte install.exe 4.5.3, wenn 4.5.3 installiert ist Starte 4.6.2 usw..
Die version wird über eine .ini Datei herausgelesen und in eine .txt geschrieben.
Habe folgenden Skript bisher gebastelt:
IF($TxtFile=4.5.0) {Start-Process "C:\update-v4.5.0-v4.5.3.exe"}
elseif($TxtFile = 4.5.3) {Start-Process "C:\update-v4.5.3-v4.6.2.exe"}
elseif($TxtFile = 4.6.2) {Start-Process "C:\update-v4.6.2-v4.6.3.exe"}
else {Write-Host "Update-Finish"}
Der Skript zeigt mir kein Fehler...aber starten tut er auch nix
Bitte um Hilfe
Vielen Dank
VG
Hanuta
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 289109
Url: https://administrator.de/forum/verschachtelte-if-abfrage-powershell-289109.html
Ausgedruckt am: 23.12.2024 um 23:12 Uhr
19 Kommentare
Neuester Kommentar
Moin,
kein Wunder das Gleichheitszeichen ist kein Vergleichsoperator in Powershell sondern ein Zuweisungsoperator ..., dafür gibt es -eq , -ne usw.
about_Comparison_Operators
Übersichtlicher gehts so:
Gruß jodel32
kein Wunder das Gleichheitszeichen ist kein Vergleichsoperator in Powershell sondern ein Zuweisungsoperator ..., dafür gibt es -eq , -ne usw.
about_Comparison_Operators
Übersichtlicher gehts so:
$version ='4.5.0'
$mapping = @{
'4.5.0' = 'C:\update-v4.5.0-v4.5.3.exe'
'4.5.3' = 'C:\update-v4.5.3-v4.6.2.exe'
'4.6.2' = 'C:\update-v4.6.2-v4.6.3.exe'
}
if ($mapping[$version]){
start-process -FilePath $mapping[$version] -wait
}else{
write-host "Keine bekannte Version" -ForeGroundColor Yellow
}
Gruß jodel32
Den Laufwerksbuchstaben von dem das Script aus aufgerufen wurde bekommst du so:
PS 2.0
oder
Ab PS 3.0:
PS 2.0
Split-Path $MyInvocation.MyCommand.Path -Qualifier
[System.IO.Path]::GetPathRoot($MyInvocation.MyCommand.Path)
Split-Path $PSCommandPath -Qualifier
Zeile 2 weglassen ...(du weist ja sonst der Schleifenvariablen immer den selben Wert zu x-))
Tja uns fehlt hier ja dein Scriptkontext Mister
Deine Zeile 7 wird wohl kaum hier die Zeile 7 sein so wie du es hier gepostet hast ....
Ein bißchen Köpfchen musst du schon benutzen, nicht gleich bei jedem Fehler aufgeben, sondern die Meldung mal hinterfragen.
Deine Zeile 7 wird wohl kaum hier die Zeile 7 sein so wie du es hier gepostet hast ....
Ein bißchen Köpfchen musst du schon benutzen, nicht gleich bei jedem Fehler aufgeben, sondern die Meldung mal hinterfragen.
Und wo definierst du $Versions ????????
Nix da davon
Du hast doch nur eine Version in der Textdatei oder was jetzt??
Nix da davon
Du hast doch nur eine Version in der Textdatei oder was jetzt??
Zitat von @Woraxor:
Naja, er versucht das Array einzulesen....bekommt aber nur einen NULL-Wert zurück...das Ergibt doch keinen Sinn? Er liest ja oben die Arrays ein
Quatsch mit Soße wo soll da ein Array sein ?? Da ist keins, ich glaube du hast meinen Code falsch interpretiert !Naja, er versucht das Array einzulesen....bekommt aber nur einen NULL-Wert zurück...das Ergibt doch keinen Sinn? Er liest ja oben die Arrays ein
Bei einer Versionsnummer aus deiner Texdatei brauchst du keine Schleife!
Bei einer Versionsnummer aus deiner Texdatei brauchst du keine Schleife! Da ist ja das gute
ach so das musst du ja auch erwähnen, das war mir nicht klar ...
Lass das mit der Schleife und rufe einfach das Skript aus sich heraus erneut auf und lese die Versionsnummer direkt aus dem System aus ...
Lass das mit der Schleife und rufe einfach das Skript aus sich heraus erneut auf und lese die Versionsnummer direkt aus dem System aus ...
Zitat von @Woraxor:
okay, dann kommt gleich die nächste Frage.... Das ist eine .ini Datei, wie kann ich dann dort nur die Versionsnr einlesen ? Habe sowas noch nie gemacht....
Hast doch oben geschrieben das du das gemacht hast ?? *Koppschüttel*okay, dann kommt gleich die nächste Frage.... Das ist eine .ini Datei, wie kann ich dann dort nur die Versionsnr einlesen ? Habe sowas noch nie gemacht....
Get-IniContent
Function Get-IniContent {
[CmdletBinding()]
Param(
[ValidateNotNullOrEmpty()]
[ValidateScript({(Test-Path $_) -and ((Get-Item $_).Extension -eq ".ini")})]
[Parameter(ValueFromPipeline=$True,Mandatory=$True)]
[string]$FilePath
)
Begin
{Write-Verbose "$($MyInvocation.MyCommand.Name):: Function started"}
Process
{
Write-Verbose "$($MyInvocation.MyCommand.Name):: Processing file: $Filepath"
$ini = @{}
switch -regex -file $FilePath
{
"^\[(.+)\]$" # Section
{
$section = $matches[1]
$ini[$section] = @{}
$CommentCount = 0
}
"^(;.*)$" # Comment
{
if (!($section))
{
$section = "No-Section"
$ini[$section] = @{}
}
$value = $matches[1]
$CommentCount = $CommentCount + 1
$name = "Comment" + $CommentCount
$ini[$section][$name] = $value
}
"(.+?)\s*=\s*(.*)" # Key
{
if (!($section))
{
$section = "No-Section"
$ini[$section] = @{}
}
$name,$value = $matches[1..2]
$ini[$section][$name] = $value
}
}
Write-Verbose "$($MyInvocation.MyCommand.Name):: Finished Processing file: $FilePath"
Return $ini
}
End
{Write-Verbose "$($MyInvocation.MyCommand.Name):: Function ended"}
}
$ini = Get-IniContent 'C:\temp\demo.ini'
$usbdrive = Split-Path $MyInvocation.MyCommand.Path -Qualifier
$mapping = @{
'4.5.0' = "$usbdrive\update-v4.5.0-v4.5.3.exe"
'4.5.3' = "$usbdrive\update-v4.5.3-v4.6.2.exe"
'4.6.2' = "$usbdrive\update-v4.6.2-v4.6.3.exe"
}
$version_start = $null
$mapping.GetEnumerator() | sort Name | select -Expand Name | %{
if($_ -eq $ini.Version.version){$version_start = $true}
if ($version_start){
Write-Host "Updating version '$_' ..."
$result = start-process -FilePath $mapping[$_] -wait -passthru
write-host "Installation wurde mit Code $($result.ExitCode) beendet.`n$('-'*30)"
}
}