PS Menu und Weiterverarbeitung
Hallo zusammen,
ich würde gerne meine Batch-Struktur auf PS umstricken. Trotz intensiver Suche ist es mir nicht gelungen, einen Ansatz zu finden, wie ich innerhalb eines Scriptes ein kleines "Programm" realisieren kann (so hatte ich es in Batch).
Die Idee ist, ein Menu zu haben und damit weitere Programmblöcke aufrufen zu können.
Hier mein Einstieg.
Das Menu startet - soweit, so gut. Unabhängig davon wäre es schön, wenn es in einer "Form" (Fenster) angezeigt würde.
Eingabe 1: Dann sollte ein weiteres Fenster starten, und den Process onedrive anzeigen. Leider geht das Fenster gleich wieder zu.
Eingabe 2: Dann sollte ein weiteres Fenster starten, und eine Liste zur Auswahl bereit stellen.
usw.
Mir ist irgendwie gar nicht klar, wie ich weitermache. Vielleicht denke ich auch viel zu kompliziert, vielleicht geht es auch nicht ...
In Batch ist es ja mit goto möglich einzelne Programmblöcke aufzurufen, abzuarbeiten und dann beispielweise zum Menu zurückzukehren.
Leider habe ich auch kein Tut oder Beispiel gefunden, an dem ich mich langhangeln kann!
Hier mein bisheriger Stand:
ich würde gerne meine Batch-Struktur auf PS umstricken. Trotz intensiver Suche ist es mir nicht gelungen, einen Ansatz zu finden, wie ich innerhalb eines Scriptes ein kleines "Programm" realisieren kann (so hatte ich es in Batch).
Die Idee ist, ein Menu zu haben und damit weitere Programmblöcke aufrufen zu können.
Hier mein Einstieg.
Das Menu startet - soweit, so gut. Unabhängig davon wäre es schön, wenn es in einer "Form" (Fenster) angezeigt würde.
Eingabe 1: Dann sollte ein weiteres Fenster starten, und den Process onedrive anzeigen. Leider geht das Fenster gleich wieder zu.
Eingabe 2: Dann sollte ein weiteres Fenster starten, und eine Liste zur Auswahl bereit stellen.
usw.
Mir ist irgendwie gar nicht klar, wie ich weitermache. Vielleicht denke ich auch viel zu kompliziert, vielleicht geht es auch nicht ...
In Batch ist es ja mit goto möglich einzelne Programmblöcke aufzurufen, abzuarbeiten und dann beispielweise zum Menu zurückzukehren.
Leider habe ich auch kein Tut oder Beispiel gefunden, an dem ich mich langhangeln kann!
Hier mein bisheriger Stand:
Function Menu
{
Clear-Host
Do
{
Clear-Host
Write-Host -Object 'Please choose an option'
Write-Host -Object '**********************'
Write-Host -Object 'Programmübersicht' -ForegroundColor Yellow
Write-Host -Object '**********************'
Write-Host -Object '1. Starte Script 1 '
Write-Host -Object ''
Write-Host -Object '2. Starte Script 2 '
Write-Host -Object ''
Write-Host -Object '3. Starte Script 3 '
Write-Host -Object ''
Write-Host -Object 'Q. Quit'
Write-Host -Object $errout
$Menu = Read-Host -Prompt '(0-3 or Q to Quit)'
switch ($Menu)
{
1
{
Get-Process -Name onedrive
}
2
{
$file = 'werte.txt'
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion
#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$bSave = New-Object System.Windows.Forms.Button
$clb = New-Object System.Windows.Forms.CheckedListBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
$handler_form1_Load= {
gc $file | %{
$line = $_.split(":")
$clb.Items.Add($line,($line[1].trim() -eq 'ja'))
}
}
$handler_bSave_Click={
0..($clb.items.Count-1) | %{"$($clb.Items[$_]):$(@{$true="ja";$false="nein"}[$clb.GetItemChecked($_)])"} | sc $file
$form1.Close()
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
# Beschriftung des Fensterinhalts / Objektklasse Label aus dem Forms Assembly
$objlabel = New-Object System.Windows.Forms.Label
# Textposition im Fenster
$objlabel.Location = "10,12"
# Reservierte Größe der Textbox / wie jede andere Textbox, z.B. mit Umbruch bei Kürze
$objlabel.Size = "200,20"
# Inhalt der Textbox
$objlabel.Text = "Auswahl treffen:"
# Name des Objektes, um es aus anderen Programmteilen darauf zugreifen zu können / könnte entfallen
$objlabel.Name = "Anweisung"
# Einbau des Objektes ins Hauptfenster
$form1.Controls.Add($objlabel)
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 489
$System_Drawing_Size.Width = 392
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.MaximizeBox = $False
$form1.Name = "form1"
$form1.Text = "MyForm"
# Neue Position :-)
$form1.StartPosition = "CenterScreen"
$form1.add_Load($handler_form1_Load)
$bSave.Anchor = 10
$bSave.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 305
$System_Drawing_Point.Y = 452
$bSave.Location = $System_Drawing_Point
$bSave.Name = "bSave"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$bSave.Size = $System_Drawing_Size
$bSave.TabIndex = 1
$bSave.Text = "Save"
$bSave.UseVisualStyleBackColor = $True
$bSave.add_Click($handler_bSave_Click)
$form1.Controls.Add($bSave)
$clb.Anchor = 15
$clb.DataBindings.DefaultDataSourceUpdateMode = 0
$clb.FormattingEnabled = $True
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 42
$clb.Location = $System_Drawing_Point
$clb.Name = "clb"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 394
$System_Drawing_Size.Width = 368
$clb.Size = $System_Drawing_Size
$clb.TabIndex = 0
$form1.Controls.Add($clb)
#endregion Generated Form Code
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
$clb.SelectedItem
} #End Function
#Call the Function
GenerateForm
}
3
{
Script 3
anyKey
}
Q
{
Exit
}
default
{
$errout = 'Invalid option please try again........Try 0-3 or Q only'
}
}
}
until ($Menu -eq 'q')
}
# Launch The Menu
Menu
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 657023
Url: https://administrator.de/contentid/657023
Ausgedruckt am: 19.11.2024 um 17:11 Uhr
24 Kommentare
Neuester Kommentar
Schau dir mal folgendes an...Diese GUI kannst du beliebig erweitern. Musst halt nur die Forms Größe ändern -> Zeile 14 & 15.
In Zeile 30 & 46 gibst du den Pfad zu deinen bereits vorhanden Skripten an. Ladebalken musst du, sofern von der jeweiligen Sprache unterstützt, direkt in deine Skripte einbauen.
In Zeile 30 & 46 gibst du den Pfad zu deinen bereits vorhanden Skripten an. Ladebalken musst du, sofern von der jeweiligen Sprache unterstützt, direkt in deine Skripte einbauen.
########################################################################################################
$window = Add-Type -memberDefinition @"
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
"@ -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru
$window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0)
########################################################################################################
Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object system.Windows.Forms.Form
$Form.Text = "Skriptsammlung"
$Form.BackColor = "Black"
$Form.TopMost = $true
$Form.Width = 300
$Form.Height = 300
$Form.StartPosition = "CenterScreen"
$Icon = [system.drawing.icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe")
$Form.Icon = $Icon
########################################################################################################
$skript1 = New-Object system.windows.Forms.Button
$skript1.Text = "Skript 1"
$skript1.AutoSize = $true
$skript1.ForeColor = "Black"
$skript1.backColor = "White"
$skript1.Cursor = [System.Windows.Forms.Cursors]::Hand
$skript1.Width = 250
$skript1.Height = 20
$skript1.Add_Click({
start-process "PFAD ZU DEINEM SKRIPT"
})
$skript1.location = new-object system.drawing.point(20,20)
$skript1.Font = "Verdana,10,style=Bold"
$Form.controls.Add($skript1)
########################################################################################################
$skript2 = New-Object system.windows.Forms.Button
$skript2.Text = "Skript 2"
$skript2.AutoSize = $true
$skript2.ForeColor = "Black"
$skript2.backColor = "White"
$skript2.Cursor = [System.Windows.Forms.Cursors]::Hand
$skript2.Width = 250
$skript2.Height = 20
$skript2.Add_Click({
start-process "PFAD ZU DEINEM SKRIPT"
})
$skript2.location = new-object system.drawing.point(20,60)
$skript2.Font = "Verdana,10,style=Bold"
$Form.controls.Add($skript2)
########################################################################################################
$bt_close = New-Object system.windows.Forms.Button
$bt_close.Text = "Beenden"
$bt_close.ForeColor = "White"
$bt_close.BackColor = "Red"
$bt_close.Cursor = [System.Windows.Forms.Cursors]::Hand
$bt_close.Width = 250
$bt_close.Height = 25
$bt_close.Add_Click({
$Form.Close()
})
$bt_close.location = new-object system.drawing.point(20,200)
$bt_close.Font = "Verdana,10,style=Bold"
$Form.controls.Add($bt_close)
########################################################################################################
[void]$Form.ShowDialog()
$Form.Dispose()
Zitat von @OKIDOKI:
Eine Frage habe ich noch: Wie ist gewährleistet, dass nach Abarbeitung eines Scriptes wieder ins Hauptmenu gesprungen wird? Durch Aufruf in der jeweiligen Batch am Ende? Und, wenn ein PS-Script abgearbeitet wird, wie dann?
Wenn du dir das Skript als .ps1 abspeicherst, bleibt sie immer geöffnet, auch nach Auswahl eines Skripts. Man muss die GUI via "Beenden" schließen.Eine Frage habe ich noch: Wie ist gewährleistet, dass nach Abarbeitung eines Scriptes wieder ins Hauptmenu gesprungen wird? Durch Aufruf in der jeweiligen Batch am Ende? Und, wenn ein PS-Script abgearbeitet wird, wie dann?
In welcher Code-Umgebung arbeitest du?
Das ist die Powershell und eigentlich auch gar nicht für GUI geeignet weil sie mit Standard Forms arbeitet
Wie es sich mit Visual Code verhält kann ich dir nicht sagen...damit habe ich mich bis jetzt noch nicht beschäftigt.
Einfach die Codezeilen von oben copy&paste in eine Text Datei...Notepad++ oder Editor o.ä.
Die Endung der Textdatei .txt dann abändern in .ps1 und Feuer frei. Sofern Powershell bei dir aktiviert ist.
Einfach die Codezeilen von oben copy&paste in eine Text Datei...Notepad++ oder Editor o.ä.
Die Endung der Textdatei .txt dann abändern in .ps1 und Feuer frei. Sofern Powershell bei dir aktiviert ist.
Ich weiß jetzt ehrlich gesagt nicht was du meinst.
Wenn du bspw. eine Batch auf einem Netzlaufwerk hast, sieht das wie folgt aus
Wenn du bspw. eine Batch auf deinem lokalen PC hast, sieht das wie folgt aus
Wenn du bspw. eine Batch auf einem Netzlaufwerk hast, sieht das wie folgt aus
$skript1 = New-Object system.windows.Forms.Button
$skript1.Text = "Skript 1"
$skript1.AutoSize = $true
$skript1.ForeColor = "Black"
$skript1.backColor = "White"
$skript1.Cursor = [System.Windows.Forms.Cursors]::Hand
$skript1.Width = 250
$skript1.Height = 20
$skript1.Add_Click({
start-process "\\server1\folder1\batch1.bat"
})
$skript1.location = new-object system.drawing.point(20,20)
$skript1.Font = "Verdana,10,style=Bold"
$Form.controls.Add($skript1)
Wenn du bspw. eine Batch auf deinem lokalen PC hast, sieht das wie folgt aus
$skript1 = New-Object system.windows.Forms.Button
$skript1.Text = "Skript 2"
$skript1.AutoSize = $true
$skript1.ForeColor = "Black"
$skript1.backColor = "White"
$skript1.Cursor = [System.Windows.Forms.Cursors]::Hand
$skript1.Width = 250
$skript1.Height = 20
$skript1.Add_Click({
start-process "C:\temp\batch2.bat"
})
$skript1.location = new-object system.drawing.point(20,20)
$skript1.Font = "Verdana,10,style=Bold"
$Form.controls.Add($skript1)
start-process cmd -Argumentlist "/c `"$psscriptroot\batch1.bat Sprungmarke`"" -wait
start cmd.exe -ArgumentList "/c","$psscriptroot\batch1.bat","Sprungmarke" -wait
Will man dagegen relativ zum Arbeitsverzeichnis einen Pfad angeben macht man dies mit .\datei.cmd, aber das Arbeitsverzeichnis ist oftmals nicht gleich dem Scripverzeichnis deswegen ist es besser man nimmt gleich die spezielle Variable $psscriptroot wenn man Pfade relativ zum Powershell Script ansprechen will.
Du hast das Escaping der Anführungszeichen mit Backtick vergessen weil dieser ja schon innerhalb von Anführungszeichen stehen ,schau dir mein Beispiel noch mal ganz genau an, dann siehst du es selbst!!
Start-Process startet die Bat in einem neuen cmd Prozess in der PS Konsole siehst du also von den Batchausgabe nichts das ist vollkommen normales Verhalten!
Du solltest dir ab und zu mal die Doku zu den CMDLets durchlesen...
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Das False kommt von einem der letzten Befehle nach dem Schließen des Fensters, nicht von der Batch die wird ja in einem separaten Prozess ausgeführt. Siehe Doku dann bestehst du's!
Du solltest dir ab und zu mal die Doku zu den CMDLets durchlesen...
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Das False kommt von einem der letzten Befehle nach dem Schließen des Fensters, nicht von der Batch die wird ja in einem separaten Prozess ausgeführt. Siehe Doku dann bestehst du's!
Dann ist deine Batch fehlerhaft programmiert.
Wenn du das Escapen nicht nutzen willst kannst du die Parameter auch als Array übergeben
Funktioniert hier einwandfrei. Wenn bei dir nicht, machst du was falsch.
Die Variante die ich hier nutze (mit den Parametern als Array), habe ich oben noch ergänzt, da brauchst du dann auch nicht escapen.
Wozu du aber hier Batches aus Powershell aufrufst statt es direkt in der PS abzufackeln erschließt sich mir ehrlich gesagt nicht, das soll hier ja das Ziel sein so wie ich gelesen habe ...
Wenn du das Escapen nicht nutzen willst kannst du die Parameter auch als Array übergeben
start-process cmd.exe -ArgumentList "/c","$psscriptroot\batch1.bat","Sprungmarke" -wait
Die Variante die ich hier nutze (mit den Parametern als Array), habe ich oben noch ergänzt, da brauchst du dann auch nicht escapen.
Wozu du aber hier Batches aus Powershell aufrufst statt es direkt in der PS abzufackeln erschließt sich mir ehrlich gesagt nicht, das soll hier ja das Ziel sein so wie ich gelesen habe ...
Zitat von @OKIDOKI:
Einzige Frage wäre noch, warum der "Gral" beim Start "False" auswürft. Habe ihr dazu noch eine Idee?
Das ist wohl Zeile 6 wo das PS Console mit der Win32 Funktion Fenster ausgeblendet wird. Jeden Funktionsaufruf deren Ausgabe du nicht nach out-null umleitest wird auch auf der Konsole angezeigt ...Einzige Frage wäre noch, warum der "Gral" beim Start "False" auswürft. Habe ihr dazu noch eine Idee?
Wir haben deinen kompletten Code aber nicht. Daher die Vermutung das du bspw. ein Control erstellst oder eine Funktion aufrufst und das das Ergebnis der Funktion ist.