fabbise
Goto Top

Powershell - Oder Funktion über Text eingabe

Guten Morgen,

ich wollte kurz Fragen, ob die Möglichkeit besteht eine "oder" funktion in die Text eingabe zu legen.

Sprich: Werden Buchstaben einegeben, so soll eine Dokumenten suche öffnen, in der man auch die Datei öffnen kann.
Werden Zahlen einegen, so soll sich direkt das Dokument öffnen.

Mein aktueller Quellcode:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Gefahrstoff ausgabe'  
$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(100,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)

$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 = 'Bitte gib einen Namen ein oder Scanne den Barcode'  
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(15,70)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Das Geöffnete Dokument schließt nach 90 sek.'  
$form.Controls.Add($label)

$form.Topmost = $true

$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $x = $textBox.Text
    $x = Start-Process  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "C:\Users\Fabbi\Documents\$x.pdf"  
    $x = Start-Process  "C:\Users\Fabbi\Desktop\Stop.bat"  
}
Die Batch Stop Killt PDFXEdit und startet das Powershell programm neu.

Grüße

Fabian

Content-Key: 591683

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

Printed on: April 25, 2024 at 00:04 o'clock

Mitglied: 145033
145033 Jul 29, 2020 updated at 07:40:18 (UTC)
Goto Top
if ($x -match '^\d+$'){  
    # barcode
}Else{
    # suche
}
Member: TK1987
TK1987 Jul 29, 2020 updated at 12:06:10 (UTC)
Goto Top
Moin.

Zitat von @Fabbise:
Die Batch Stop Killt PDFXEdit und startet das Powershell programm neu.
Warum das? Lass das doch direkt alles vom Powershell-Script erledigen, dann ploppen da auch nicht ständig irgendwelche Fenster lästig hin und her.

Ich würde die Form erst gar nicht Enden lassten, sondern nur kurzzeitig das Fenster verstecken lassen.

Statt form.AcceptButton und Button.DialogResult einfach das Click-Event des Buttons nutzen:
$okButton.Add_Click({
  # Fenster verstecken
  $Form.Hide()

  # Prüfen, Ob Eingabe eine Nummer ist
  if ( [int]::TryParse($TextBox.Text,[ref]$Null) ) {
    # Dokument öffnen, falls es existiert
    if (Test-Path "$HOME\Documents\$($Textbox.text).pdf") {  
      $Process = Start-Process -PassThru  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "$HOME\Documents\$($Textbox.text).pdf"  
      # warte 90 Sekunden
      Start-Sleep 90
      # Beende Dokument wieder
      Stop-Process -Id $Process.Id
      }
    }
  else {
    # Eingabe ist ein Text, mache was auch immer...

   }

  # Textfeld leeren
  $TextBox.Text = ""  
  # Fenster wieder zeigen
  $Form.Show()
  $Textbox.Select()
  })

Gruß Thomas
Member: Fabbise
Fabbise Jul 29, 2020 at 09:21:30 (UTC)
Goto Top
Statt form.AcceptButton und Button.DialogResult einfach das Add_Click-Event des Buttons nutzen:
Muss ich Add_Click oben bei dem Button einfügen?
Kenne mich in Powershell noch nicht so gut aus.

Grüße
Fabian
Member: TK1987
Solution TK1987 Jul 29, 2020 updated at 10:06:00 (UTC)
Goto Top
Zusammengebaut (und imao etwas übersichtlicher gestaltet) sieht dein Skript hinterher so aus:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form -Property @{
  Text = 'Gefahrstoff ausgabe'  
  Size = '300,200'  
  StartPosition = 'CenterScreen'  
  Topmost = $true
  }

$label1 = New-Object System.Windows.Forms.Label -Property @{
  Location = '10,20'  
  Size = '280,20'  
  Text = 'Bitte gib einen Namen ein oder Scanne den Barcode'  
  }

$label2 = New-Object System.Windows.Forms.Label -Property @{
  Location = '15,70'  
  Size = '280,20'  
  Text = 'Das Geöffnete Dokument schließt nach 90 sek.'  
  }

$textBox = New-Object System.Windows.Forms.TextBox -Property @{
  Location = '10,40'  
  Size = '260,20'  
  }
  
$okButton = New-Object System.Windows.Forms.Button -Property @{
  Location = '100,120'  
  Size = '75,23'  
  Text = 'OK'  
  }
  
$okButton.Add_Click({
  $Form.Hide()
  if ( [int]::TryParse($TextBox.Text,[ref]$Null) ) {
    if (Test-Path "$HOME\Documents\$($Textbox.text).pdf") {  
      $Process = Start-Process -PassThru  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "$HOME\Documents\$($Textbox.text).pdf"  
      Start-Sleep 90
      Stop-Process -Id $Process.Id
      }
    }
  else {
    # Eingabe ist ein Text, mache was auch immer...

    }

  $TextBox.Text = ""  
  $Form.Show()
  $Textbox.Select()
  }) # Ende $okButton.Add_Click
  
$form.Controls.AddRange(@($label1,$label2,$textBox,$okButton))
[void]$form.ShowDialog()

Gruß Thomas
Member: Fabbise
Fabbise Jul 30, 2020 at 06:49:30 (UTC)
Goto Top
Guten Morgen Thomas,

gerade ist mir Aufgefallen, das bei einer Zahlen eingabe das Programm zu else springt.
Weist du wie ich es Lösen kann?

Grüße und einen schönen Tag
Fabian
Member: TK1987
TK1987 Jul 30, 2020 at 07:22:51 (UTC)
Goto Top
Moin Fabian.

Zitat von @Fabbise:
gerade ist mir Aufgefallen, das bei einer Zahlen eingabe das Programm zu else springt.
Bei einer reinen Zahleneingabe kann das nicht sein.

Ich vermute mal, es wurde eine Zahl eingegeben, zu der kein passendes PDF existiert - in dem Fall öffnet sich dann einfach das Fenster wieder - in die vorhandene else-Anweisung kann er in dem Fall jedoch nicht reinspringen.

Du könntest dies ebenfalls noch mit einer else Anweisung abfangen.
  if ( [int]::TryParse($TextBox.Text,[ref]$Null) ) {
    if (Test-Path "$HOME\Documents\$($Textbox.text).pdf") {  
      $Process = Start-Process -PassThru  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "$HOME\Documents\$($Textbox.text).pdf"  
      Start-Sleep 90
      Stop-Process -Id $Process.Id
      }
    else {
      # Zu der eingegebenen Nummer existiert keine passende PDF-Datei...
      
      }
    }
  else {
    # Eingabe ist ein Text, mache was auch immer...

    }
Member: Fabbise
Fabbise Jul 30, 2020 at 07:38:50 (UTC)
Goto Top
Das ist echt merkwürdig. Hab gerade den zweiten else Befehl eingefügt.
Es wird trotzdem noch zur else (Eingabe Text) gesprungen.
Bin ich einfach zu Blöd dafür?
$okButton.Add_Click({
  $Form.Hide()
  if ( [int]::TryParse($TextBox.Text,[ref]$Null) ) {
  if (Test-Path "C:\Users\z003sy6h\Documents\$($Textbox.text).pdf") {  
      $Process = Start-Process -PassThru  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "C:\Users\z003sy6h\Documents\$($Textbox.text).pdf"  
      Start-Sleep 90
      Stop-Process -Id $Process.Id
      }
    else {
    Start-Process  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "C:\Users\z003sy6h\Documents\$($Textbox.text).pdf"  
        }
      } 
  else {
       # Eingabe ist ein Text, mache was auch immer...
    Invoke-Expression "c:\windows\explorer.exe C:\Users\z003sy6h\Documents\Gefahrstoffe"  
Member: TK1987
Solution TK1987 Jul 30, 2020 at 07:54:55 (UTC)
Goto Top
Zitat von @Fabbise:
Das ist echt merkwürdig. Hab gerade den zweiten else Befehl eingefügt.
Es wird trotzdem noch zur else (Eingabe Text) gesprungen.
Wie genau sieht deine Eingabe denn aus? Da sind wahrscheinlich noch andere Zeichen drin enthalten.

Probier es selbst aus:
[int]::TryParse("6546548",[ref]$NULL)  
Du kannst die Zahl beliebig verändern, du erhältst als Ergebnis immer True, solange es sich um eine reine Zahlenfolge handelt.
Member: Fabbise
Fabbise Jul 30, 2020 at 08:09:12 (UTC)
Goto Top
Super, dass klappt!

Gibt man nun Buchstaben ein schließt und Öffnet sofort die eingabe. Der Else befehl wird nicht ausgeführt.
Kann ich das sonst mit If machen?
Member: TK1987
TK1987 Jul 30, 2020 at 08:20:52 (UTC)
Goto Top
Du hast den Befehl nicht so in das If-Statement geschrieben oder?! Das war nur zum überprüfen deiner Eingabe gedacht, du musst natürlich weiterhin die Variable $Textbox.Text mit TryParse überprufen lassen, sonst ist es ja egal was du eingibst.

Schreib doch bitte mal, was genau du da vorhin eingegeben hast, sodass er vorhin in die Else-Anweisung gesprungen ist...
Member: Fabbise
Fabbise Jul 30, 2020 updated at 08:25:04 (UTC)
Goto Top
In else Sprang er als:
$okButton.Add_Click({
  $Form.Hide()
  if ( [int]::TryParse($TextBox.Text,[ref]$Null) ) {
 if (Test-Path "C:\Users\z003sy6h\Documents\$($Textbox.text).pdf") {  
      $Process = Start-Process -PassThru  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "C:\Users\z003sy6h\Documents\$($Textbox.text).pdf"  
      Start-Sleep 90
      Stop-Process -Id $Process.Id

Aktuell sieht es so aus:
$okButton.Add_Click({
  $Form.Hide()
  if ( [int]::TryParse("6546548",[ref]$NULL) ) {  
 if (Test-Path "C:\Users\z003sy6h\Documents\$($Textbox.text).pdf") {  
      $Process = Start-Process -PassThru  "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" "C:\Users\z003sy6h\Documents\$($Textbox.text).pdf"  
      Start-Sleep 90
      Stop-Process -Id $Process.Id

Die PDF datei Öffnet jetzt bei einer Zahlenfolge
Member: TK1987
TK1987 Jul 30, 2020 updated at 08:29:45 (UTC)
Goto Top
Wie gesagt, das if-Statement muss weiterhin [int]::TryParse($TextBox.Text,[ref]$Null) lauten!

Du soll schreiben, was du in dem Textfeld eingegeben hast, sodass er in else gesprungen ist.
Member: Fabbise
Fabbise Jul 30, 2020 at 09:17:11 (UTC)
Goto Top
Vielen Dank Thomas!

für deine Hilfe und deine Ausdauer mir zu Antworten.
Ich habe gerade einen Lösungsweg gefungen.

Liebe Grüße
Fabian