reaper911211
Goto Top

PS1 konvertieren zu EXE mit ps2exe Fehler

Guten Tag,

ich habe mir ein Skript zusammen gebastelt mit dem ich sehen kann ob der Proxy an einem Computer eingeschalten oder ausgeschalten ist und habe dieses als Exe Datei exportiert. Der Export hat einwandfrei geklappt aber jedes mal wenn ich das Fenster offen habe und es dann wieder schließe(es ist hierbei egal ob ich eine IP-Adresse mit Port angebe oder ob ich es Weg klicke über das X oder ob ich auf Proxy deaktivieren klicke) kommt ein kleineres Popup Fenster mit dem Inhalt "Cancel".
Ich finde einfach meinen Fehler nicht und hoffe das mir hier jemand helfen kann.

Ich habe euch mal das komplette Skript eingestellt mit Minimalen Änderungen. Es wurde mein Reallife Name entfernt und der Benutzername von meinem Benutzer wurde durch %Username% gewechselt.

Wäre super wenn jemand die Lösung findet. Weil eigentlich möchte ich noch mehr Skripts die ich habe als ausführbare Programme erstellen um diese nutzen zu können. Finde das für die Arbeit etwas leichter als jedes mal die Skripte auszuführen weil nicht jeder Computer direkt die ps Skripte als Datei ausführt.

Das ist mein erster Export den ich bisher gemacht habe mit meinen Skripten. Habe es mit noch keinem anderen versucht. Hatte auch schonmal testweise ChatGPT drüber schauen lassen um zu sehen ob die vielleicht klüger ist als ich. Aber auch ChatGPT wollte den Fehler nicht finden und sagte ständig ich soll Exit ans ende schreiben obwohl es dort bereits steht.


Ich konvertiere die Ps1 zu einer exe mit dem Befehl:

Invoke-ps2exe -InputFile "F:\Dokumente\Skripting\Powershell\Proxy_Konfig_06.ps1" -OutputFile "F:\Dokumente\Skripting\Powershell\Proxy_Konfigarator.exe" -IconFile "C:\Users\%USERNAME%\Downloads\Skriptpics\Proxy01.ico" -noConsole -sta  -verbose -x64  


Skript:
# Importiere die Windows Forms-Bibliothek für GUI-Elemente
Add-Type -AssemblyName System.Windows.Forms

# Funktion zur Abruf der aktuellen Proxy-Einstellungen
function Get-ProxySettings {
    $proxy = Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"  
    return $proxy  # Gib die Proxy-Einstellungen zurück
}

# Funktion zur Validierung der Proxy-Adresse
function Validate-ProxyAddress {
    param (
        [string]$address
    )
    return $address -match '^\d{1,3}(\.\d{1,3}){3}:\d{1,5}$'  
}

# Funktion zur Anzeige des Proxy-Dialogfensters
function Show-ProxyDialog {
    $proxySettings = Get-ProxySettings  # Hole aktuelle Proxy-Einstellungen

    # Erstelle das Hauptformular für den Dialog
    $form = New-Object System.Windows.Forms.Form
    $form.Text = "Proxy Konfiguration"  # Fensterüberschrift geändert  
    $form.StartPosition = "CenterScreen"  # Zentriere das Fenster auf dem Bildschirm  
    $form.FormBorderStyle = 'FixedDialog'  # Fixiere die Fenstergröße  
    $form.MaximizeBox = $false  # Maximieren-Button deaktivieren
    $form.MinimizeBox = $false  # Minimieren-Button deaktivieren

    # Aktuelle Proxy-Informationen anzeigen
    $currentProxyLabel = New-Object System.Windows.Forms.Label
    $currentProxyLabel.Text = "Aktueller Proxy: $($proxySettings.ProxyServer)"  # Zeigt den aktuellen Proxy an  
    $currentProxyLabel.AutoSize = $true  # Automatische Anpassung der Größe
    $form.Controls.Add($currentProxyLabel)  # Füge das Label zum Formular hinzu

    # Status des Proxys anzeigen
    $proxyStatus = if ($proxySettings.ProxyEnable) { "Aktiv" } else { "Inaktiv" }  
    $statusLabel = New-Object System.Windows.Forms.Label
    $statusLabel.Text = "Status: $proxyStatus"  # Status des Proxys anzeigen  
    $statusLabel.AutoSize = $true  # Automatische Anpassung der Größe
    if ($proxySettings.ProxyEnable) {
        $statusLabel.BackColor = [System.Drawing.Color]::Green  # Grüner Hintergrund für "Aktiv"  
    } else {
        $statusLabel.BackColor = [System.Drawing.Color]::Red  # Roter Hintergrund für "Inaktiv"  
    }
    $form.Controls.Add($statusLabel)  # Füge das Status-Label zum Formular hinzu

    # Eingabefeld für die Proxy-Adresse mit Platzhalter
    $proxyInput = New-Object System.Windows.Forms.TextBox
    $proxyInput.Text = "IP-Adresse:Port"  # Platzhaltertext  
    $proxyInput.ForeColor = [System.Drawing.Color]::Gray  # Textfarbe für Platzhalter
    $proxyInput.Font = New-Object System.Drawing.Font("Arial", 10)  # Schriftgröße  

    # Platzhalter-Funktionalität
    $proxyInput.Add_KeyDown({
        if ($proxyInput.ForeColor -eq [System.Drawing.Color]::Gray -and $proxyInput.Text -eq "IP-Adresse:Port") {  
            $proxyInput.Text = ""  # Lösche den Platzhalter bei Tastenanschlag  
            $proxyInput.ForeColor = [System.Drawing.Color]::Black  # Setze Textfarbe auf Schwarz
        }
        if ($_.KeyCode -eq [System.Windows.Forms.Keys]::Enter) {
            $proxyAddress = $proxyInput.Text.Trim()  # Hole die Eingabe für den Proxy
            if (-not (Validate-ProxyAddress $proxyAddress)) {
                [System.Windows.Forms.MessageBox]::Show("Bitte geben Sie eine gültige Proxy-Adresse im Format IP-Adresse:Port ein.", "Ungültige Eingabe", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Warning)  
                return
            }
            try {
                Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyEnable -Value 1  # Proxy aktivieren  
                Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyServer -Value $proxyAddress  # Proxy-Adresse setzen  
                [System.Windows.Forms.MessageBox]::Show("Proxy wurde aktiviert: $proxyAddress", "Erfolg", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Information)  
                $proxyInput.Text = ""  # Eingabefeld leeren  
                $form.Close()  # Schließe das Formular
            } catch {
                [System.Windows.Forms.MessageBox]::Show("Fehler beim Aktivieren des Proxys: $_", "Fehler", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error)  
            }
        }
    })

    $proxyInput.Add_Leave({
        if ($proxyInput.Text -eq "") {  
            $proxyInput.Text = "IP-Adresse:Port"  # Setze Platzhalter zurück, wenn leer  
            $proxyInput.ForeColor = [System.Drawing.Color]::Gray  # Setze Textfarbe auf Grau
        }
    })

    $form.Controls.Add($proxyInput)  # Füge das Eingabefeld zum Formular hinzu

    # Label für die Eingabefelder
    $proxyLabel = New-Object System.Windows.Forms.Label
    $proxyLabel.Text = "Proxy-Adresse:"  # Beschriftung für das Eingabefeld  
    $proxyLabel.AutoSize = $true  # Automatische Anpassung der Größe
    $form.Controls.Add($proxyLabel)  # Füge das Label zum Formular hinzu

    # Buttons für Aktivieren/Deaktivieren
    $enableButton = New-Object System.Windows.Forms.Button
    $enableButton.Text = "Proxy aktivieren"  # Button-Beschriftung  
    $enableButton.AutoSize = $true  # Automatische Anpassung der Größe
    $form.Controls.Add($enableButton)  # Füge den Button zum Formular hinzu

    $disableButton = New-Object System.Windows.Forms.Button
    $disableButton.Text = "Proxy deaktivieren"  # Button-Beschriftung  
    $disableButton.AutoSize = $true  # Automatische Anpassung der Größe
    $form.Controls.Add($disableButton)  # Füge den Button zum Formular hinzu

    # Copyright-Hinweis
    $copyrightLabel = New-Object System.Windows.Forms.Label
    $copyrightLabel.Text = "© by Reaper911211"  # Copyright-Text  
    $copyrightLabel.AutoSize = $true  # Automatische Anpassung der Größe
    $copyrightLabel.Font = New-Object System.Drawing.Font("Arial", 7)  # Kleinere Schriftgröße  
    $form.Controls.Add($copyrightLabel)  # Füge den Copyright-Hinweis hinzu

    # Bild hinzufügen
    $pictureBox = New-Object System.Windows.Forms.PictureBox
    $pictureBox.Image = [System.Drawing.Image]::FromFile("C:\Users\%USERNAME%\Downloads\Skriptpics\Proxy01.png")  # Bild laden  
    $pictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::StretchImage  # Bild anpassen
    $pictureBox.Location = New-Object System.Drawing.Point(150, 60)  # Position des Bildes im Fenster
    $pictureBox.Size = New-Object System.Drawing.Size(120, 120)  # Bildgröße
    $form.Controls.Add($pictureBox)  # Füge das Bild zum Formular hinzu

    # Setze das Fenster auf die gewünschte feste Größe
    $form.Size = New-Object System.Drawing.Size(312, 232)  # Breite und Höhe des Fensters

    # Positioniere die Steuerelemente
    $currentProxyLabel.Location = New-Object System.Drawing.Point(10, 10)  # Position im Fenster
    $statusLabel.Location = New-Object System.Drawing.Point(10, 30)  # Position unter dem aktuellen Proxy
    $proxyLabel.Location = New-Object System.Drawing.Point(10, 70)  # Position über dem Eingabefeld
    $proxyInput.Location = New-Object System.Drawing.Point(10, 90)  # Position im Fenster
    $enableButton.Location = New-Object System.Drawing.Point(10, 130)  # Position im Fenster
    $disableButton.Location = New-Object System.Drawing.Point(10, 160)  # Position im Fenster
    $copyrightLabel.Location = New-Object System.Drawing.Point(10, 185)  # Position des Copyright-Hinweises (höher gesetzt)

    # Button-Funktionalität für Proxy aktivieren
    $enableButton.Add_Click({
        $proxyAddress = $proxyInput.Text.Trim()  # Hole die Eingabe für den Proxy
        if (-not (Validate-ProxyAddress $proxyAddress)) {
            [System.Windows.Forms.MessageBox]::Show("Bitte geben Sie eine gültige Proxy-Adresse im Format IP-Adresse:Port ein.", "Ungültige Eingabe", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Warning)  
            return
        }
        try {
            Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyEnable -Value 1  # Proxy aktivieren  
            Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyServer -Value $proxyAddress  # Proxy-Adresse setzen  
            [System.Windows.Forms.MessageBox]::Show("Proxy wurde aktiviert: $proxyAddress", "Erfolg", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Information)  
            $proxyInput.Text = ""  # Eingabefeld leeren  
            $form.Close()  # Schließe das Formular
        } catch {
            [System.Windows.Forms.MessageBox]::Show("Fehler beim Aktivieren des Proxys: $_", "Fehler", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error)  
        }
    })

    # Button-Funktionalität für Proxy deaktivieren
    $disableButton.Add_Click({
        try {
            Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyEnable -Value 0  # Proxy deaktivieren  
            [System.Windows.Forms.MessageBox]::Show("Proxy wurde deaktiviert.", "Erfolg", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Information)  
            $form.Close()  # Schließe das Formular
        } catch {
            [System.Windows.Forms.MessageBox]::Show("Fehler beim Deaktivieren des Proxys: $_", "Fehler", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error)  
        }
    })

    # Zeige das Formular im Vordergrund an
    $form.TopMost = $true  # Fenster im Vordergrund
    $form.ShowDialog()  # Zeige das Dialogfenster an
}

# Zeige den Proxy-Dialog
Show-ProxyDialog

Exit
cancel

Content-ID: 669075

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

Ausgedruckt am: 23.11.2024 um 08:11 Uhr

catrell
Lösung catrell 28.10.2024 aktualisiert um 15:51:43 Uhr
Goto Top
Moin ändere die Zeile
$form.ShowDialog()
in
[void]$form.ShowDialog()
Oder gleich den gesamten Output der Funktion selbst unterdrücken mittels
Show-ProxyDialog | out-null
Das hat den Vorteil, dass falls du aus versehen noch weitere Ausgaben in der Funktion tätigst, diese ebenfalls unterdrückt werden.
Ansonsten gibt nämlich der Funktionsaufruf den DialogResult (Cancel) der Form zurück. Und der wird bei der Wandlung als EXE halt per Default als Msgbox dargestellt statt auf einer Konsole ausgegeben zu werden.

Gruß catrell
Reaper911211
Reaper911211 28.10.2024 um 17:19:27 Uhr
Goto Top
@catrell Vielen dank. Das war die beste und schnellste Antwort die ich bisher bekam :D
catrell
catrell 28.10.2024 um 17:31:37 Uhr
Goto Top
Keine Ursache.
TK1987
TK1987 29.10.2024 um 07:45:27 Uhr
Goto Top
Moin,

alternativ gibt es bei ps2exe auch die Parameter:
    -noOutput [<SwitchParameter>]
        the resulting executable will generate no standard output (includes verbose and information channel)

    -noError [<SwitchParameter>]
        the resulting executable will generate no error output (includes warning and debug channel)

Damit werden alle Meldungen standardmäßig unterdrückt.

Gruß Thomas