okidoki
Goto Top

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:

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

Content-ID: 657023

Url: https://administrator.de/forum/ps-menu-und-weiterverarbeitung-657023.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

chkdsk
Lösung chkdsk 01.03.2021 um 10:05:47 Uhr
Goto Top
Du möchtest also eine GUI mit Buttons haben, welche nach betätigen ein neues Skript starten?
OKIDOKI
OKIDOKI 01.03.2021 aktualisiert um 11:24:25 Uhr
Goto Top
So isses 😊
Für meine Weiterarbeit wäre es wichtig:
- eine GUI mit Buttons für weitere Scripte
- die Scripte sind sowohl Batch + vbs + PS (wie beispielsweise txt-Bearbeitung Nr. 2 oben)
- während der Abarbeitung einen Ladebalken zu haben (muss keinesfalls ein Fortschrittsbalken sein, da das Script aber andere benutzen sollen, müssen sie wissen, dass es noch "lebt")
- nach der Scriptabarbeitung wieder zu Start-GUI kommen zu können

PS: Was mir halt völlig unklar ist, wie eine solche Struktur aussehen könnte. In Batch ist mir die Stapelverarbeitung klar, ich kann super in meinem Script hin- und herspringen. Ich kann mir Hilfsdateien (vbs) bauen, aufrufen und abarbeiten lassen - dann wieder zurück zum Start - und währenddessen noch einen ganz einfachen Busy Indicator laufen lassen. Und das alles in einem Script ... So eine einfache "Programmstruktur" habe ich nach bereits sehr langer Suche in PS nicht gefunden, sondern immer nur "einfache" Aufgaben pro Script.
chkdsk
Lösung chkdsk 01.03.2021 um 11:51:42 Uhr
Goto Top
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.
########################################################################################################
$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()
OKIDOKI
OKIDOKI 01.03.2021 aktualisiert um 13:02:50 Uhr
Goto Top
Hey chckdsk, das ist schon mal total klasse!!!
Habe mich schon in einige Tuts eingearbeitet, auch bei MS, aber das Gefühl gehabt, dass ich mich so meinem Anliegen nicht nähern kann!
Bei der Gestaltung deines Scriptes finde ich mich aber (dank der Vorarbeit 😊) gut zurecht.
So würde ich jetzt einfach mal ins Eingemachte gehen und für meine Bedürfnisse anpassen.

Ich hoffe, dass dies auch ein Grundgerüst für andere user sein könnte (bin zumindest einigen Suchenden auf der Reise begegnet). vielleicht entsteht hieraus ein kleines Tut, das an mancher Stelle vielfältig erweiterbar werden könnte!

HERZLICHEN DANK, genau das, was ich gesucht habe (bei allen bisherigen Einarbeitungen wäre ich nie zu einem solchen, übersichtlichen Ergebnis gekommen, das sich vermutlich vielfältig erweitern lässt!)

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?
Eine zweite:
Beim Aufruf in der PS-Console startet es wunderbar. Rufe ich es allerdings bei Visual Studio Code auf, folgt folgende Fehlermeldung beim Start:
In D:\Menu.ps1:64 Zeichen:44
+     $bt_close.Font = "Verdana,10,style=Bold"  
+                                            ~
Die Zeichenfolge hat kein Abschlusszeichen: ".  
In D:\Menu.ps1:69 Zeichen:20
+     $Form.Dispose()
+                    ~
Schließende ")" fehlt in einem Ausdruck.  
In D:\batches\temp-auslesen\Menu-timeit.ps1:69 Zeichen:20
+     $Form.Dispose()
+                    ~
")" fehlt in einem Methodenaufruf.  
    + CategoryInfo          : ParserError: (:) , ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

In welcher Code-Umgebung arbeitest du?

okidoki
chkdsk
chkdsk 01.03.2021 um 14:03:46 Uhr
Goto Top
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.

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
OKIDOKI
OKIDOKI 01.03.2021 um 14:19:48 Uhr
Goto Top
Ich danke dir noch einmal vielmals! Dank Administrator gehen Träume in Erfüllung!!!
OKIDOKI
OKIDOKI 01.03.2021 um 14:48:50 Uhr
Goto Top
Jetzt muss ich leider noch einmal stören: Wie öffne ich das Script?
Also, unter der Console geht es, unter Visual Studio Code kommt o.g. Fehlermeldung.
Unter folgendem Aufruf startet es aus einer Batch nicht (andere Scripts kein Problem):
powershell.exe -ExecutionPolicy Bypass -File "dateiname.ps1"  
sondern bringt ebenfalls o.g. Fehlermeldung!

Hast du eine Idee, wie ich das Script zum Laufen bringe?
(Console bringt nichts, weil es von anderen auf anderen Rechnern laufen soll)
chkdsk
chkdsk 01.03.2021 um 15:07:09 Uhr
Goto Top
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.
OKIDOKI
OKIDOKI 01.03.2021 um 17:00:30 Uhr
Goto Top
Leider, leider, ich bekomme es nicht mehr hin, es läuft nicht 😢😢😢.

Hast du noch einen Tipp, ich war so glücklich vorhin, würde deinen Code so gerne ausbauen!!!

Es bleibt bei o.g. Fehlermeldung, andere Scripte starten durch denselben Aufruf problemlos ...
PS: Es geht auch nicht durch Doppelklick trotz geänderter Richtlinie!
PS C:\WINDOWS\system32> Get-ExecutionPolicy
RemoteSigned
PS C:\WINDOWS\system32>
chkdsk
chkdsk 01.03.2021 um 17:31:36 Uhr
Goto Top
Poste mal bitte deinen kompletten Code sowie die dazugehörige Fehlermeldung. Laut obiger Fehlermeldung fehlen Klammern
OKIDOKI
OKIDOKI 01.03.2021 aktualisiert um 19:44:09 Uhr
Goto Top
ok, nach den ganzen Änderungen mit PS habe ich den Rechner noch einmal neu gestartet, deinen Code noch einmal neu eingelesen, gespeichert und nun geht es (plötzlich) auch mithilfe der Batch, dein Script zu starten!!! (verrückt!)
YEAH, Fernheilung face-smile

So, werde jetzt den heiligen Gral weiter ausbauen und meine Erkenntnisse hier teilen - damit auch anderen geholfen werden kann!
Falls jemand selbst ein Anliegen hat, können wir das gerne in dieses kleine Projekt mit übernehmen face-smile

Puh, alles gut!
Danke dir chckdsk noch einmal für deine Hilfe!
OKIDOKI
OKIDOKI 02.03.2021 aktualisiert um 20:42:36 Uhr
Goto Top
Hallo chckdsk,
mal eine kleine Rückmeldung aus dem Labor:
Ich habe ja bisher ein funktionierendes Script in Batch. Nun habe ich gedacht, dass es erst einmal am sinnvollsten wäre, wenn ich nicht einzelne Scriptteile in einzelnen Scripten schreibe, sondern bei Button 1 das Script xyz.bat an der Sprungmarke :button1 öffnen lasse.
Nur, wie gebe ich das ein zusammen mit der Pfadangabe, da PS ja keine relativen Pfade mag ...
Hier müsste es ja hin:
  start-process "PFAD ZU DEINEM SKRIPT"  
chkdsk
chkdsk 03.03.2021 um 07:28:35 Uhr
Goto Top
Ich weiß jetzt ehrlich gesagt nicht was du meinst.
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)
OKIDOKI
OKIDOKI 03.03.2021 um 07:44:05 Uhr
Goto Top
... das ist mir soweit klar face-smile
Leider findet das Script aber die Batch mit einem Parameter (zum Einstieg in die Batch an einer bestimmten Sprungmarke), nicht, wenn es im selben Verzeichnis liegt, aber die Pfadangabe (weil relativ) nicht angegeben ist.

Vom Konstrukt müsste es so sein, damit er die Datei findet:

start-process "batch2.bat" "Sprungmarke"

oder eben
start-process relativer-Pfad"batch2.bat" "Sprungmarke"
oder
start-process Get-Location"batch2.bat" "Sprungmarke"

also, wenn PS die Datei nicht findet, dass irgendwie der Pfad vorher ermittelt wird mit Get-Location - nur, wie einbauen? face-smile
147669
147669 03.03.2021 aktualisiert um 11:06:24 Uhr
Goto Top
start-process cmd -Argumentlist "/c `"$psscriptroot\batch1.bat Sprungmarke`"" -wait  
oder alternativ auch
start cmd.exe -ArgumentList "/c","$psscriptroot\batch1.bat","Sprungmarke" -wait  
$psscriptroot enthält immer den Ordner in dem das gerade ausgeführte Script liegt.

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.
OKIDOKI
OKIDOKI 03.03.2021 um 08:15:14 Uhr
Goto Top
Hey, das ist schon mal total klasse!

Soweit geht es, allerdings funktioniert die Parameterübergabe (also die Sprungmarke, bei der er beim Batch einsteigen soll) noch nicht:
start-process cmd -Argumentlist "/c `"$psscriptroot\test.bat" "start1"`  
Dann kommt die Meldung:
Start-Process : Es wurde kein Positionsparameter gefunden, der das Argument "start1" akzeptiert.  

Unabhängig davon:
Wenn das nackte Script (Original) startet folgt im Fenster gleich die Anzeige:
PS C:\Users> d:\batches\Menu.ps1
False
147669
147669 03.03.2021 aktualisiert um 09:44:20 Uhr
Goto Top
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!!
OKIDOKI
OKIDOKI 03.03.2021 aktualisiert um 10:01:49 Uhr
Goto Top
hmm, ich habe deinen Code hineinkopiert, damit wirklich alles drin ist ...
Es passiert gar nichts 😒: (also keine Meldung)
start-process cmd -Argumentlist "/c `"$psscriptroot\adress.bat`" `"Start`""  

Außer False, ds steht wie gehabt (hat aber mit o.g. vermutlich nix zu tun) 😂
147669
147669 03.03.2021 aktualisiert um 10:11:14 Uhr
Goto Top
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!
OKIDOKI
OKIDOKI 03.03.2021 aktualisiert um 10:18:40 Uhr
Goto Top
das habe ich gemacht, du hast auch vollkommen recht!

Das Problem ist aber, dass er die Sprungmarke innerhalb der Batch nicht findet!
Wenn ich die weglasse, geht es ja:
start-process cmd -Argumentlist "/c `"$psscriptroot\adress.bat`" "  
nur die Sprungmarke findet er nicht ... dazu steht auch keine Lösung in dem Link (soweit ich das sehe)
147669
147669 03.03.2021 aktualisiert um 11:28:05 Uhr
Goto Top
Dann ist deine Batch fehlerhaft programmiert.

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  
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.
screenshot

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 ...
OKIDOKI
OKIDOKI 03.03.2021 um 12:37:52 Uhr
Goto Top
Tataa, tataa, super!!!

Also, tacko.
Es liegt natürlich an der Batch. Funktionieren tut es nicht, aus PS einfach eine Batch aufzurufen und gleich zu einer Sprungmarke zu springen.
Dafür benötigt der Einstieg noch einen Hinweis. Dann funktioniert es auch mit allen hier vorgestellten Beispielen!

VIELEN DANK SchmitzKatz und chckdsk!!!
Danke SchmitzKatz für deine Batch!!!

Und natürlich hast du recht, meinen gesamten Code in PS umzumodeln. Da aber noch einige Teile vbs und batch schaffe ich das nicht gleich in einem Zug - dafür reichen meine Kenntnisse nicht. Außerdem muss es währenddessen produktiv quasi weiter genutzt werden 😊.
Mit anderen Worten: Step by step. So habe ich aber schon einmal die Startseite (den heiligen Gral 😎) und kann mich am Hauptgerüst (die Batch) entlanghangeln - und die noch vor mir liegenden Blöcke Stück für Stück in PS umsetzen!

Einzige Frage wäre noch, warum der "Gral" beim Start "False" auswürft. Habe ihr dazu noch eine Idee?
147669
147669 03.03.2021 aktualisiert um 15:43:58 Uhr
Goto Top
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 ...
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.
OKIDOKI
OKIDOKI 03.03.2021 aktualisiert um 19:22:31 Uhr
Goto Top
Der komplette Code ist bisher noch der heilige Gral face-smile also s.o.
Den wollte ich erst einmal soweit optimieren, dass es keine Fehlermeldungen gibt - bevor ich weiter daran herumstricke. Sonst komme ich den Fehlern irgendwann nicht auf die Spur ... so meine Vermutung!

ok, habe Zeile 6 nach dem Tipp von SchmitzKatz geändert, voila, Meldung weg!!!

$window::ShowWindow((Get-Process -id $pid).MainWindowHandle, 0) | Out-Null