Powershell Script soll keine Duplikate in der DB erstellen?

Hallo,

ich habe ein Powershell Script welches Daten von API Seiten abfragt und diese in eine Datenbank schreibt. Das funktioniert soweit auch. Leider dupliziert das Script bei jeder Abfrage die Daten in der Datenbank, dabei sollen schon vorhandene Datensätze nicht erneut geschrieben werden sondern nur neue, die auf der abgefragten Seite hinzugekommen sind. Habe verschiedene Lösungswege versucht aber nichts funktionierte. Entweder schrieb das Script trotzdem Duplikate oder es gab andere Fehlermeldungen... Kann mir jemand sagen wie ich das lösen kann?

Das Script:

# Konfiguration der Vote-Server

$voteServer = @(

   @("LINKZURAPI1", "1.Server", 3),

   @("LINKZURAPI2", "2.Server", 3)

)

# MySQL-Datenbank

$MySQLHost = "localhost"

$MySQLPort = "3306"

$MySQLDatabase = "test"

$MySQLUser = ""

$MySQLPassword = ""

# Funktion zum Überprüfen und Erstellen der Tabelle

function Ensure-DatabaseTable {

   param (

       [MySql.Data.MySqlClient.MySqlConnection]$connection

   )

   $tableName = "votings"

   $query = @"

   CREATE TABLE IF NOT EXISTS $tableName (

       id INT PRIMARY KEY AUTO_INCREMENT,

       name VARCHAR(100),

       voteAt DATE,

       server VARCHAR(100),

       site VARCHAR(100),

       received TINYINT(4) DEFAULT 0,

       coins INT DEFAULT 0

   );

"@

   $command = $connection.CreateCommand()

   $command.CommandText = $query

   $command.ExecuteNonQuery() | Out-Null

}

# Verbindung zur Datenbank

try {

   [System.Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\MySQL\MySQL Connector NET 8.2.0\MySQL.Data.dll") | Out-Null

   $constr = "server=$($MySQLHost);port=$($MySQLPort);database=$($MySQLDatabase);user id=$($MySQLUser);password=$($MySQLPassword)"

   $con = New-Object MySql.Data.MySqlclient.MySqlConnection($constr)

   $maxAttempts = 5

   $attempts = 0

   while ($attempts -lt $maxAttempts -and $con.State -ne 'Open') {

       try {

           $con.Open()

       } catch {

           Write-Output "Fehler beim Verbinden zur Datenbank: $_"

       }

       $attempts++

       Start-Sleep -Seconds 1

   }

   # Verbindung erfolgreich oder nicht

   if ($con.State -ne 'Open') {

       Write-Output "Verbindung zur Datenbank konnte nicht hergestellt werden."

       Exit

   } else {

       Write-Output "Datenbankverbindung erfolgreich geöffnet."

   }

# Abfrage für die Vote Links

foreach ($server in $voteServer) {

   try {

       Write-Output "Starte Abfrage für Server $($server[1])"

       $r = Invoke-RestMethod -Method Get -Uri $server[0]

       if ($r.GetType().FullName -eq "System.String") {

           Write-Output "Abruf vom Vote-Server fehlgeschlagen (String erhalten)."

           Continue

       }

foreach ($voter in $r.data) {

   $votedatum = $voter.timestamp

   if (![System.DBNull]::Value.Equals($votedatum) -and $votedatum -ne $null -and $votedatum -ne "") {

       try {

           $date = [datetime]::ParseExact($votedatum, 'yyyy-MM-ddTHH:mm:ssZ', $null)

           $cmd = $con.CreateCommand()

           $cmd.CommandText = @"

               INSERT INTO votings (name, voteAt, server, site, received, coins)

               VALUES (@name, @voteAt, @server, @site, @received, @coins)

               ON DUPLICATE KEY UPDATE

                   name = VALUES(name),

                   voteAt = VALUES(voteAt),

                   server = VALUES(server),

                   site = VALUES(site),

                   received = VALUES(received),

                   coins = VALUES(coins)

"@

           $cmd.Parameters.AddWithValue("@name", $voter.Username) | Out-Null

           $cmd.Parameters.AddWithValue("@voteAt", $date.ToString("yyyy-MM-dd")) | Out-Null

           $cmd.Parameters.AddWithValue("@server", $server[1]) | Out-Null

           $cmd.Parameters.AddWithValue("@site", 'deutsche-arkserver') | Out-Null

           $cmd.Parameters.AddWithValue("@received", 0) | Out-Null

           $cmd.Parameters.AddWithValue("@coins", 0) | Out-Null

           $cmd.ExecuteNonQuery() | Out-Null

           Write-Output "Datensatz für $($voter.Username) erfolgreich eingefügt oder aktualisiert."

       } catch {

           Write-Output "Fehler beim Einfügen oder Aktualisieren in die Datenbank: $_"

       }

   }

}

       Write-Output "Abfrage für Server $($server[1]) erfolgreich durchgeführt."

   } catch {

       Write-Output "Fehler bei Server $($server[1]): $_"

       Write-Output $_.Exception.InnerException.StackTrace

   }

}

} catch {

   Write-Output "Fehler beim Verbinden zur Datenbank: $_"

} finally {

# Schließe die Datenbankverbindung am Ende der äußeren Schleife

if ($con.State -eq 'Open') {

   $con.Close()

   Write-Output "Datenbankverbindung erfolgreich geschlossen."

}

}

Datenbank, MySQL, PowerShell
Ubuntu /etc/bin/bluetooth/main.conf Standard inhalt zurück bekommen?

Hab bisschen mist gebaut denke ich und bräuchte die Standart werte von Ubuntu 23.04 von einer Guten Quelle oder direkt von dem Source Code, leider nicht auf Github gefunden.

Wollte eigentlich nur meine Air Pods Pro 2 Fixen da immer nur einer gleichzeitig Musik abspielen konnte.
Der andere war wahrscheinlich als ein Mikrofon eingestellt da auch unter Klang und Eingang Air Pods eingestellt war uwas ich nicht will das das System überhaupt ein Mikro benutzt. Aber man muss eins wählen in diesem Options ding.

Und ja hab schon versucht von ControllerMode = bredr auf dual zu wechseln, deswegen geht es überhaupt erst auf einem ohr aber nicht auf beiden.
Ich muss auch bei jedem neustart des Pcs oder nach einer weile die Air Pods wieder erneut trennen und verbinden über bluetooth.
Das läuft dann jeden tag so ab : komplett entfernen, Case öffnen mit beiden air pods drinne.
taste auf der rückseite gedrückt halten bis es einen sound macht und weiss leuchtet.
auf verbinden klicken sobald es ubuntu erkennt und warten.
dann nehme ich erstmal einen kopfhörer raus und gucke ob sound kommt, es kommt keiner dann nehme ich den zweiten aus der case raus und da spielt sich dann musik ab.

das ist alles unmöglich zu benutzen und andere Kopfhörer hab ich leider zurzeit nicht. Meine overear mit aux sind kaputt gegangen und ich will auch keine Overear mehr weil ich dadurch haarausfall erleide, mit in ears hab ich keine Probleme.

PC, Server, Apple, Computer, Windows, Betriebssystem, Technik, Bluetooth, Linux, IT, Programmierer, Ubuntu, Bash, developer, Fachinformatiker, Informatik, Informatiker, IT-Sicherheit, Linux Mint, macOS, netzwerkadministrator, Netzwerktechnik, Open Source, openSUSE, OS, Programmiersprache, Script, Shell, Treiber, Unix, Arch Linux, Konfiguration, Systemwiederherstellung, Texteditor, Bluetooth-Kopfhörer, Dateisystem, Debian, PowerShell, Windows 10, github, Manjaro, Windows 11, AirPods, Air Pods Pro
PowerShell / REST Microsoft Azure: Get-AzPolicyStateSummary?

Moin!

Ich möchte den Ist-Status der Policy Compliance in einer Subscription reporten.

Ich ziehe also folgend die Daten:

$azState = Get-AzPolicyStateSummary -SubscriptionId $subscriptionId
    $exportObject.Compliance.TotalRessources = $azState.Results.ResourceDetails[0].Count + $azState.Results.ResourceDetails[1].Count + $azState.Results.ResourceDetails[2].Count
    $exportObject.Compliance.CompliantRessources = $azState.Results.ResourceDetails[0].Count
    $exportObject.Compliance.NonCompliantRessources = $azState.Results.ResourceDetails[1].Count
    $exportObject.Compliance.Exceptions = $azState.Results.ResourceDetails[2].Count
    $exportObject.Compliance.Percentage = [math]::Round((1.0 - $exportObject.Compliance.NonCompliantRessources / ($exportObject.Compliance.CompliantRessources + $exportObject.Compliance.NonCompliantRessources + $exportObject.Compliance.Exceptions)) * 100)

Beziehen kann ich so erfolgreich die Resource Compliance in Prozent, die Gesamtzahl der Ressourcen sowie die Aufteilung wie viel Compliant, Non-Complient und 'Other' sind.

Problematisch ist aber, dass ich nicht die Non-Compliant Initiatives und Non-Compliant Policies beziehen kann. Die Werte, wie ich sieh auch beziehe scheinen nie mit diesen Werten übereinzustimmen. Entweder kriege ich deutlich niedrigere oder deutlich höhere Werte.

Hat daher jemand eine Idee, wie ich die Daten richtig filtern kann oder z.B. über die Graph API die korrekten Daten beziehen kann?

PC, Computer, Microsoft, programmieren, Programmiersprache, Rest, Softwareentwicklung, Cloud, API, azure, PowerShell
powershell script für vergleicher zweier Excel-dateien?

Hi Leutz,

ich brauche hilfe bei einem Powershell-Script das mir 2 riesige(20+ Mappen in den Dateien) Exceldateien inhaltlich vergleicht und mir dann möglichst die nicht übereinstimmenden Zellen(mit jeweiliger Arbeitsmappe) ausgibt und das am besten in eine separate Excel/CSV-Datei schreibt, damit ich schauen kann welcher der Einträge aktueller ist.

bisher sieht mein script so aus:

# Pfade zu den zu vergleichenden Dateien definieren

$PfadDatei1 = "X:\xyz\IP-Adressen.xlsx"

$PfadDatei2 = "X:\xyz\IP-Adressen2.xlsx"

# Excelldateien in Powershellobjekte laden

$ExcelInhalt1 = get-content -Path $PfadDatei1

$ExcelInhalt2 = get-content -Path $PfadDatei2

# Vergleichen der Excell-Inhalte

$Unterschiede = Compare-Object -ReferenceObject $PfadDatei1 -DifferenceObject $PfadDatei2

# Prüfen ob Unterschiede gefunden wurden und Ausgabe derer

if ($Unterschiede.count -eq 0)

{

   Write-Host "Keine Unterschiede gefunden"

}

else

{

   Write-Host "Unterschiede gefunden"

   $Unterschiede | Export-Csv -Path "X:\xyz\Documents\Ergebnis.csv" -NoTypeInformation -Force

}

Das Script vergleicht die Dateien zwar, gibt mir aber total kryptische Ergebnisse aus. Also als würde ich ne C++ Datei verschlüsselt im Editor öffnen

Hat jemand ne Idee was ich da ändern muss damit der mir das so ausgibt, dass ich am besten den Namen der Arbeitsmappe und die Zelle ausgegeben bekomme?

danke schon mal

Microsoft Excel, programmieren, Script, PowerShell, Office 365
Powershell remote Script zum Client wird ausgeführt aber ohne Fehlermeldung und ohne starten der Anwendung?

Hallo, ich versuche vom Host per Remote auf eine VM mit Remote eine Anwendung zu starten und bekomme auch die Rückmeldung das der Prozess gestartet ist, (Es wird auch kurz ein PowerShell Fenster angezeigt und die Anwendung startet auch irgendwann im Hintergrund) aber egal was ich versuche die Anwendung lässt sich nicht normal starten. Der ps Befehl an sich funktioniert an sich (etwas abgeändert) einwandfrei auf dem Client. Das komische ist ja das einfache Sachen wie eine Txt Datei erstellen ohne Probleme funktionieren. Ich hab in der vm schon alles mögliche probiert auch ohne Firewall gleiches Ergebnis. openai hat auch schon aufgegeben, anscheinend soll laut meinem Kollegen sowas vorher ohne Probleme funktioniert haben, aber an den win Updates kanns nicht liegen da die vm frisch installiert ist. Chrome wurde nur als Test mit eingefügt


$chromeScriptBlock = {

  Start-Process -FilePath "C:\Program Files\Google\Chrome\Application\chrome.exe" -WindowStyle Normal

}

$padScriptBlock = {

  $padExePath = "C:\Program Files (x86)\Power Automate Desktop\PAD.Console.Host.exe"

  $flowUrl = "XXXXr"

  Start-Process -FilePath $padExePath -ArgumentList $flowUrl -WindowStyle Normal

}

# Für Chrome

C:\Users\Administrator\Desktop\PSTools\psexec.exe \\192.168.56.10 -i 1 -u XX powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command & {$chromeScriptBlock}"

# Für Power Automate Desktop

C:\Users\Administrator\Desktop\PSTools\psexec.exe \\192.168.56.10 -i 1 -u XX -p XXX-d powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command & {$padScriptBlock}"

Server, Script, PowerShell, Remote Desktop, Windows 10, windows server 2019
Wie lege ich einen lokalen Benuterz mithilfe eines Powersehll Skript an?

Hierzu möchte ich ein Formular vwerdenden.

Folgendes habe ich erstellt:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = 'lokaler Benutzer'
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Benutzername:'
$form.Controls.Add($label)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,70)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'vollständiger Name:'
$form.Controls.Add($label)
$Benutzername = New-Object System.Windows.Forms.TextBox
$Benutzername.Location = New-Object System.Drawing.Point(10,40)
$Benutzername.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($Benutzername)
$Name = New-Object System.Windows.Forms.TextBox
$Name.Location = New-Object System.Drawing.Point(10,90)
$Name.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($Name)
$form.Topmost = $true
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
   $x = $textBox.Text
   $x
}
New-LocalUser $Benutzername  -FullName $Name
Windows, programmieren, Code, dotNet, PowerShell
IT-Fachkräfte im Informatik Unterricht in Schulen?

Hallo,

der klassische Weg um in Deutschland Lehrer zu werden ist über ein Lehramtsstudium oder mit zunächst Berufserfahrung sammeln im jeweiligen Fachbereich und dann auch mit einem Studium Berufsschullehrer werden.

Doch sind wir uns selbst mal gegenüber ehrlich welcher Fachinformatiker wird freiwillig, wenn er nicht auf den Kopfgefallen ist und 9+ Jahre Berufserfahrung hat auf das Jahresgehalt von jenseits über den 50.000,€ verzichten, um in einer unterbezahlten Lehrer Position anzufangen ?

Dieses Phänomen macht sich an den grund- und weiterbildenden Schulen [Grundschule, Realschule, Gymnasium,...] bemerkbar.

In den ersten Schuljahren gelten wichtigere Prioritäten wie lesen und schreiben lernen.

Doch aller spätestens ab der 5. Klasse werden die ersten Grundkenntnisse zum Computer vermittelt .

Im Unterricht wird meist mit den wichtigsten Office Programmen aus dem Hause Microsoft oder Open Office angefangen, doch dies zieht sich meiner Erfahrung nach bis zum Erhalt des Abschlusses.

Schüler mit Technischem Interesse erledigen die Textformatierung- oder Tabellenkalkulationsaufgabe in unter 15 Minuten und langweilen sich dann die Restliche Zeit der Unterrichtsstunde.

Und trotz des Informatikunterrichts werden IT´ler Tagtäglich zu Fehlertickets her zitiert wie z.B. mein Drucker druckt nicht, Passwort vergessen, Herr/Frau Ich-weiß-alles-besser und weiteren gerufen.

Bei uns in der Kommune hat nun ein neuer junger Bürgermeister angefangen, der sich die Digitalisierung auf die Fahne geschrieben hat.

Meine Idee wäre ihn an sein Wahlprogramm zu erinnern ihm von meiner damaligen Erfahrung mit Win 2000 im Jahre 2009 im Informatikunterricht  zu berichten und den späteren Erfahrungen in der weiterführenden Schule mit dem Quantensprung auf Windows 10.

Gleichzeitig möchte ich auch einen Vorschlag unterbreiten, um die Schüler für die sich stetig weiterentwickelte Computerwelt zu wappnen auch in Bezug auf das Internet [Social Media,..] und den damit verbundenen Risiken.

Also konkret IT-Fachkräfte planen aktiv den Unterricht gemeinsam mit den Lehrkräften, bieten außerdem eine Informatik AG an und kümmern sich um die IT-Infrastruktur der Schule.

Funfakt unser damaliges Netzwerk war so schlecht eingerichtet, dass jeder Schüler Admin Rechte am PC hatte und mit etwas Ahnung per Remote ganze Rechner herunterfahren konnte.

Wäre das rein rechtlich möglich das IT-Fachkräfte beratend ohne Lehrerstudium am Unterricht beteiligt sind ?

Bzw. der Bürgermeister das, wenn auch mit Abstimmung des KM einführen darf.

Computer, Microsoft Word, Lernen, Studium, Microsoft Excel, Schule, Microsoft PowerPoint, Netzwerk, HTML, CSS, Bildung, Java, Unterricht, JavaScript, Schüler, ASCII, Beamte, Fachinformatiker, Informatik, Informatiker, Informationstechnik, Informationstechnologie, Lehrer, Lehrerin, Pascal, Python, Team, turbo pascal, Rathaus, Bürgermeister, Fachinformatiker Systemintegration, kultusministerium, PowerShell, schulcomputer, Angular, lehren
PowerShell Skript ist zu langsam?

Der Code ist für unser Betriebs Netzwerk zu langsam. Lokal funktioniert alles super. Wie kann man den Code schneller machen?

Code:

$desktopFolder=[Environment]::GetFolderPath('Desktop')
$VonOrdner="\\deploy\deployment$\log\EmpPackages"
$global:NachOrdner="$desktopFolder\test2"
$Dateiname="Alle2.log"


Copy-Item "$VonOrdner\$Dateiname" $global:NachOrdner
  #Inhalt der KopiertestServer.txt Datei einlesen
$global:VergleichsString=try{[System.IO.File]::ReadAllText("$VonOrdner\$Dateiname")}catch{}  


New-Item $global:NachOrdner -ItemType "directory" -force #Ordner anlegen falls er nicht existiert


$watcher=New-Object System.IO.FileSystemWatcher
$watcher.Path=$VonOrdner
$watcher.Filter=$Dateiname
$watcher.IncludeSubdirectories=$false
$watcher.EnableRaisingEvents=$false 


$action={


  $changeType = $Event.SourceEventArgs.ChangeType
  $VonPfad = $Event.SourceEventArgs.FullPath
  $SourceDatei = $Event.SourceEventArgs.Name
  $NachPfad = "$global:NachOrdner\$SourceDatei"


    #Den neuen Inhalt einlesen
  $NeuerInhalt=try{[System.IO.File]::ReadAllText($VonPfad)}catch{}
    
  Write-Host "Start" 


  #Ab hier hängt sich auf
  #---------------------------------------------------------------------------------------------------------------------
  $Unterschied=$NeuerInhalt -replace "^$global:VergleichsString",''
  #---------------------------------------------------------------------------------------------------------------------


    #Ausgabe des Unterschiedes
  Write-Host "Unterschied: $Unterschied" -fo red
  [System.IO.File]::AppendAllText($NachPfad,$Unterschied)
    #vergleichsstring updaten
  $global:VergleichsString=$NeuerInhalt
}


Register-ObjectEvent $watcher "Changed" -Action $action|Out-Null


while ($true) {
  sleep 1
}
programmieren, Shell, PowerShell

Meistgelesene Fragen zum Thema PowerShell