marcimarc85
Goto Top

Powershell Variable mit User aus mysql Abfrage

Hallo. ich mal wieder.

Ich benötige eine Variable mit einem Usernamen, den ich aus einer MySQL Datenbank in Windows abfragen möchte.

den Pfad zum mysql bin-Verzeichnis hab ich bereits in einer variablen $mysql_bin_path


$username = [$mysql_bin_path] \mysql.exe -h 127.0.0.1 -u root -ppassword dbname -e "select username from useraccount where username regexp 'RSS_A'  

So in der Art müsste das abgefragt werden. Die Syntax ist natürlich nicht korrekt.

Als Ausgabe bzw. Wert für die Variable soll dann nur "RSS_A" oder RSS_A_1" oder RSS_A_2" etc. ausgegeben werden.

Der username ist von Datanbank zu Datenbank unterschiedlich, weshalb ich die Variable gern mit dieser Art Abfrage setzten würde

Content-Key: 441320

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

Printed on: April 23, 2024 at 23:04 o'clock

Mitglied: 139374
139374 Apr 17, 2019 updated at 10:25:11 (UTC)
Goto Top
den Pfad zum mysql bin-Verzeichnis hab ich bereits in einer variablen $mysql_bin_path
Vollkommen überflüssig. Powershell kann nativ über die NET Klassen ohne irgendwelchen Kommandozeilen-Tools auf mySQL Server zugreifen!
https://www.google.com/search?q=Powerhsell+mySQL+Query
http://www.techtrek.io/connecting-powershell-to-mysql-database/
usw.
Die Bemühung der Kommandozeile aus Powershell heraus ist also vollkommen überflüssiger Overhead. Powershell arbeitet ja objektorientiert und so sollte man es auch primär nutzen, nicht wie in Batch wo alles ein String oder Zahl ist.
Member: MarciMarc85
MarciMarc85 Apr 17, 2019 at 11:09:29 (UTC)
Goto Top
Das würde aber bedeuten, ich müsste auf jedem Server zuerst den MySQL .NET Connector installieren. Da hab ich bei über 200 Servern in unterschiedlichen Domänen nicht wirklich Lust zu.
Mitglied: 139374
139374 Apr 17, 2019 updated at 11:15:27 (UTC)
Goto Top
, ich müsste auf jedem Server zuerst den MySQL .NET Connector installieren.
Nein, die DLL reicht völlig, Installation unnötig.
Member: MarciMarc85
MarciMarc85 Apr 17, 2019 at 12:53:42 (UTC)
Goto Top
Danke @139374. Das funktioniert perfekt. Mein testlauf sieht nun wie folgt aus:

[void][System.Reflection.Assembly]::LoadFrom("D:\MySql.Data.RT.dll")  
$myconnection = New-Object MySql.Data.MySqlClient.MySqlConnection
$myconnection.ConnectionString = "server=127.0.0.1;user id=dbadmin;password=dbpassword;database=mydatabase;pooling=false"  


$myconnection.Open()
$mycommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$mycommand.Connection = $myconnection
$mycommand.CommandText = "select username from useraccount where username regexp 'RSS_A'"  
$myreader = $mycommand.ExecuteReader()
while($myreader.Read()){ $myreader.GetString(0) }
$myconnection.Close()

Ausgegeben wird nun:

RSS_A_1
RSS_A_2

jetzt möchte ich den user RSS_A_1, also das erste ergebnis als Variable haben. und den langen Codeblock gern "einklappen mit {}
Mitglied: 139374
139374 Apr 17, 2019 updated at 12:58:35 (UTC)
Goto Top
jetzt möchte ich den user RSS_A_1, also das erste ergebnis als Variable haben
Hab ich dir beim letzten Mal doch schon gezeigt Stichwort select -First 1 oder eben über den ArrayIndex der Ausgabe .

Oder direkt über SQL via **SELECT TOP 1 ......" Dann bekommst du direkt auch nur ein Ergebnis.
Member: MarciMarc85
MarciMarc85 Apr 18, 2019 at 05:18:50 (UTC)
Goto Top
Danke. Das funktioniert.
Kannst du mir evtl. noch helfen, wie ich die Ausgabe "RSS_A_1" nun in die Variable bekomme Bsp.: $user = RSS_A_1
Mitglied: 139374
139374 Apr 18, 2019 updated at 05:37:04 (UTC)
Goto Top
Zitat von @MarciMarc85:

Danke. Das funktioniert.
Kannst du mir evtl. noch helfen, wie ich die Ausgabe "RSS_A_1" nun in die Variable bekomme Bsp.: $user = RSS_A_1
Oh man, frag dich doch mal selbst was
$myreader.GetString(0) wohl macht ...
Genau, holt den String einer Tabellenspalte nacheinander für jede Ergebniszeile.
https://docs.microsoft.com/de-de/dotnet/api/system.data.sqlclient.sqldat ...
D.h. jedes mal wenn du die. read() Methode aufrufst enthält $reader jeweils eine neue Zeile . Brauchst du also nur den Wert der erste Zeile brauchst du keine While Schleife mehr sondern rufst einmalig $reader.Read() auf um dann den Wert in deine ach so heiß geliebte Variable zu schreiben
$var = $reader.GetString(0).
Und, war das nun so schwer? Nee nee, hätte nur einen kleinen Blick in die Referenz genügt.
Member: MarciMarc85
MarciMarc85 Apr 18, 2019 updated at 05:49:27 (UTC)
Goto Top
Heute mit dem falschen Fuß aufgestanden?
Natürlich hab ich diese Variante längst versucht. das endet aber immer in einer Fehlermeldung:

$myconnection.Open()
$mycommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$mycommand.Connection = $myconnection
$mycommand.CommandText = "select username from useraccount where username regexp 'RSS_A' limit 1"  
$myreader = $mycommand.ExecuteReader()
while($myreader.Read()){ $myreader.GetString(0) } 
$myconnection.Close()


$user = $myreader.GetString(0)


Ergebnis:

$myconnection.Open()
$mycommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$mycommand.Connection = $myconnection
$mycommand.CommandText = "select username from useraccount where username regexp 'RSS_A' limit 1"
$myreader = $mycommand.ExecuteReader()
while($myreader.Read()){ $myreader.GetString(0) }
$myconnection.Close()


$user = $myreader.GetString(0)


RSS_A_1
Exception calling "GetString" with "1" argument(s): "You have specified an invalid column ordinal."
At line:17 char:1

back-to-top$user = $myreader.GetString(0)

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile , MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException


PS C:\Windows\system32>
Mitglied: 139374
Solution 139374 Apr 18, 2019 updated at 06:21:02 (UTC)
Goto Top
Nö, aber wenn man noch nicht mal vorher zumindest ins Handbuch schaut und jeden Furz erfragt ärgert das schon zwischenzeitlich in einem Admin-Forum und man kommt sich verkackeiert vor.

Steht doch da
You have specified an invalid column ordinal.
Gib den passenden Spaltenindex oder Name an und fertig!

Viel Spaß noch.
Member: MarciMarc85
MarciMarc85 Apr 18, 2019 at 06:20:12 (UTC)
Goto Top
Es funktioniert jetzt. Danke dennoch!
Member: MarciMarc85
MarciMarc85 Apr 29, 2019 at 10:15:27 (UTC)
Goto Top
Hi,

Der befehl funktioniert ja nun. Nun ist es aber so, dass dazu jedes Mal eine Ausgabe generiert wird.

PS C:\WINDOWS\system32> C:\Users\hage02\Desktop\powershell_tools\update_wizard.ps1
$myconnection = New-Object MySql.Data.MySqlClient.MySqlConnection 
$myconnection.ConnectionString = "server=$mysql_host;user id=dbadmin;password=password;database=mydatabase;pooling=false"   
RSS_A

Diese drei Zeilen werden nun in jedem weiteren Script, in welchem ich dieses Script mit der MYSQL Abfrage einlese, immer zu Begin angezeigt.
Kann ich diese Ausgabe irgendwie unterbinden?