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-Key: 5908621513

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

Printed on: April 28, 2024 at 08:04 o'clock

Mitglied: 5175293307
5175293307 Feb 08, 2023 updated at 10:29:53 (UTC)
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
Member: MarciMarc85
MarciMarc85 Feb 08, 2023 at 12:48:54 (UTC)
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.
Mitglied: 5175293307
5175293307 Feb 08, 2023 updated at 13:08:31 (UTC)
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.
Member: MarciMarc85
MarciMarc85 Feb 08, 2023 at 13:46:45 (UTC)
Goto Top
Leider bleibt das Ergebnis gleich
Mitglied: 5175293307
5175293307 Feb 08, 2023 updated at 15:17:26 (UTC)
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.
Member: MarciMarc85
MarciMarc85 Feb 09, 2023 at 09:07:20 (UTC)
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
Mitglied: 5175293307
5175293307 Feb 09, 2023 at 09:12:07 (UTC)
Goto Top
$version = [regex]::match($out,'(?i)default=(\d+)').Groups[1].Value  
Member: MarciMarc85
MarciMarc85 Feb 09, 2023 at 09:23:03 (UTC)
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
Mitglied: 5175293307
Solution 5175293307 Feb 09, 2023 updated at 09:35:00 (UTC)
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 ...
Member: MarciMarc85
MarciMarc85 Feb 09, 2023 at 10:04:19 (UTC)
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.