marcimarc85
Goto Top

Meldung aus Batch in Powershell Script anzeigen

Hallo,

Ich habe ein Powershell Script gebastelt für eine automatische Installation. An einer Stelle wird ( sofern notwendig) ein Update der MySQL Datenbank gemacht. Das passiert durch ein seperates Batch-Script und muss auch Batch bleiben. Das Powershell startet also das Batch "mysql_update.bat". Dieses Script prüft nun die aktuelle Version der Datenbank mit der zu erwartenden notwendigen. Falls ein Updaste notwendig ist, kommt im Batch-Script die Meldung z.B.

 Migrate database on 127.0.0.1:3306 from 926 to 1002? (y/n)
Das "y" bestätige ich automatisch aus dem Powershell-Script, indem ich das Batch Script mit

echo 'Y' | cmd.exe /C "$db_scripts $db_update_arguments "  

aufrufe.

Das Problem jetzt ist nur, dass ich gern ein Datenbankbackup vorher ausführen lassen würde, bevor ein Datenbankupdate ausgeführt wird.
Für das Datenbankbackup wird ein seperates Backup Script ausgeführt.
Ich muss jetzt nur einen Trigger haben, der erkennt, ob ein Datenbankupdate bemacht werden soll. Dazu dachte ich mir, ich kann die Meldung von oben nehmen:

Migrate database on 127.0.0.1:3306 from

Wenn das als Rückmeldung kommt, soll zuerst das Backup starten. Die Meldung wird allerdings nur im Batch-Script angezeigt, was durch das Powershell-Script im Hintergrund läuft. Im Powershell selbst, wird diese nicht angezeigt.

Lange Rede, kurzer Sinn: Kann ich den Befehl zum Starten des Batch Scripts ein Parameter mitgeben, dass alle echos aus dem Batch-Script auch in der Powershell angezeigt und verarbeitet werden können?

Vielen Dank schonmal

Content-ID: 5908621513

Url: https://administrator.de/contentid/5908621513

Ausgedruckt am: 25.11.2024 um 04:11 Uhr

5175293307
5175293307 08.02.2023 aktualisiert um 11:29:53 Uhr
Goto Top
if ((&"D:\script.cmd") -match 'Migrate database'){  
    # mach was
}else{
   # mach sonst was
}
oder mit .NET Process und Stout
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "D:\Pfad\prog.exe"  
$pinfo.Arguments = "parameter1 parameter2"  
$pinfo.UseShellExecute = $false
$pinfo.CreateNoWindow = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.RedirectStandardError = $true

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $pinfo
$process.Start() | out-null

$out = while(!$process.HasExited){
    $process.StandardOutput.ReadLine()
    sleep(1)
}
if ($out -match 'Migrate database'){  
    # mach was
}else{
   # mach sonst was
}

Wurstel
MarciMarc85
MarciMarc85 08.02.2023 um 13:48:54 Uhr
Goto Top
Zitat von @5175293307:

if ((&"D:\script.cmd") -match 'Migrate database'){  
    # mach was
}else{
   # mach sonst was
}
oder mit .NET Process und Stout
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "D:\Pfad\prog.exe"  
$pinfo.Arguments = "parameter1 parameter2"  
$pinfo.UseShellExecute = $false
$pinfo.CreateNoWindow = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.RedirectStandardError = $true

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $pinfo
$process.Start() | out-null

$out = while(!$process.HasExited){
    $process.StandardOutput.ReadLine()
    sleep(1)
}
if ($out -match 'Migrate database'){  
    # mach was
}else{
   # mach sonst was
}

Wurstel

Vielen Dank für die schnelle Hilfe. Klingt auch logisch. Allerdings bekomme ich die Ausgabe weiterhin nicht angezeigt. Das Script wartet an der Stelle quasi auf die Bestätigung durch "y" aber in der Powershell wird nichts angegeben: Der genauer Aufruf des Scripts geschieht mit Parametern (vielleicht liegt es daran?):

$db_scripts = (Get-ChildItem -Path ("$install_path\-Server-$new_server_version-x64\dbscripts" ) | Where {$_.Name -like 'migrate_db.bat'}) | % {$_.VersionInfo} | Select -expand FileName  
#$db_update_arguments = "$hostname 3306 dbuser dbpwd . "  

Daraus resultuierend sollte dann das Ergebnis sein:

D:\server\bin\Server-11.1.19-x64\dbscripts>migrate_db.bat 127.0.0.1 3306 dbuser dbpwd .
Das Batch Script startet und bei notwendiger Migration, gibt es diesen Text aus:


Migrate database on 127.0.0.1:3306 from 926 to 1002? (y/n)

Genau diese Meldung benötige ich im Powershell zum Prüfen (zumindest "Migrate database" damit ich eben das Backup Script starten kann

Aber wie gesagt, die Meldung scheinbar nicht an Powershell weitergeleitet. Ich habe beide Varianten von dir versucht und das Script waret an der Stelle immer auf eine Eingabe.
5175293307
5175293307 08.02.2023 aktualisiert um 14:08:31 Uhr
Goto Top
Dann wird der Text vermutlich in StdErr ausgegeben in der o.a. Schleife also noch ein zusätzliches
$process.StandardError.ReadLine()
einfügen damit StdErr mit erfasst wird.
MarciMarc85
MarciMarc85 08.02.2023 um 14:46:45 Uhr
Goto Top
Leider bleibt das Ergebnis gleich
5175293307
5175293307 08.02.2023 aktualisiert um 16:17:26 Uhr
Goto Top
Tja wenn man nicht weis was in der Batch mit welchem Befehl ausgeführt wird ...
Leite einfach alles was in deinen Batches ausgegeben wird mal nach Stdout um, kannst du auch testen indem du die Ausgabe mal in eine Datei umleitest.
MarciMarc85
MarciMarc85 09.02.2023 um 10:07:20 Uhr
Goto Top
Zitat von @5175293307:

Tja wenn man nicht weis was in der Batch mit welchem Befehl ausgeführt wird ...
Leite einfach alles was in deinen Batches ausgegeben wird mal nach Stdout um, kannst du auch testen indem du die Ausgabe mal in eine Datei umleitest.

Ich habe noch einen anderen Ansatz: Starte ich das Script für das Update der db-version, ohne Parameter, kommt eine Meldung, dass Parameter Notwendig sind und zusätztlich die erwartete db-version, die installiert werden muss. Mit welchem Powershell Befehl, kann ich die Version jetzt in eine Variable packen? Also im Prinzip den Wert nach "default?=" in eine Variable schreiben:

.\migrate_db.bat 
Usage: D:\server\bin\Server-11.1.19-x64\dbscripts\migrate_db.bat <host> <port> <dbuser> <dbpassword> <path to migrate.sql scripts> (target db version, default=1002)
Example: D:\server\bin\Server-11.1.19-x64\dbscripts\migrate_db.bat 127.0.0.1 3306 dbadmin secretpassword . 42
5175293307
5175293307 09.02.2023 um 10:12:07 Uhr
Goto Top
$version = [regex]::match($out,'(?i)default=(\d+)').Groups[1].Value  
MarciMarc85
MarciMarc85 09.02.2023 um 10:23:03 Uhr
Goto Top
Hatte eher an einen simplen einzeiler gedacht à la

cmd /C $db_scripts | select-string "default=" -AllMatches | % { $_.Matches } | % { $_.Value }  

da bekomme ich aber lediglich "default=" ausgegeben. Brauche aber den Wert dahinter
5175293307
Lösung 5175293307 09.02.2023 aktualisiert um 10:35:00 Uhr
Goto Top
Zitat von @MarciMarc85:

Hatte eher an einen simplen einzeiler gedacht à la
Is es doch?! Einfach das $out durch (dein Befehl in Klammern ersetzen )...
$version = [regex]::match((cmd /C $db_scripts),'(?i)default=(\d+)').Groups[1].Value  

da bekomme ich aber lediglich "default="
Weil der Regex ja auch nur das Default= berücksichtigt und nix dahinter, ist doch logisch ...
cmd /C $db_scripts | select-string -pattern "default=(\d+)"  | % {$_.Matches.Groups[1].Value}  
https://tio.run/##NcqxCsIwEADQXzmCQkUbUndnp64utcjZnG3hSEJy0aH126MIro8X/I ...
MarciMarc85
MarciMarc85 09.02.2023 um 11:04:19 Uhr
Goto Top
Zitat von @5175293307:

Zitat von @MarciMarc85:

Hatte eher an einen simplen einzeiler gedacht à la
Is es doch?! Einfach das $out durch (dein Befehl in Klammern ersetzen )...
$version = [regex]::match((cmd /C $db_scripts),'(?i)default=(\d+)').Groups[1].Value  

da bekomme ich aber lediglich "default="
Weil der Regex ja auch nur das Default= berücksichtigt und nix dahinter, ist doch logisch ...
cmd /C $db_scripts | select-string -pattern "default=(\d+)"  | % {$_.Matches.Groups[1].Value}  
https://tio.run/##NcqxCsIwEADQXzmCQkUbUndnp64utcjZnG3hSEJy0aH126MIro8X/I ...

Danke!!! Du hast natürlich recht! Manchmal sieht man den wald vor lauter Bäumen nicht.