nagus
Goto Top

Powershell Inputbox

Moin zusammen,

ich hänge gerade an folgendem Problem fest:

ich möchte eine Input-Box haben, mit der ich ein Datum abfrage. Das klappt auch ganz gut, nur habe ich noch ein Problem mit dem Rückgabewert:

Das ist das Eingabe Fenster:
$datum = Get-Date -Format "dd.MM.yyyy"  

function get-input2 ([String]$Advice,[String]$Boxname,$Hint)
{
    $AdviceDate = Get-Date -Format "dd.MM.yyyy"  
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')  
    $Value = [Microsoft.VisualBasic.Interaction]::InputBox($Advice, $boxname, $AdviceDate)
   
        return $Value
}

$CreationDate = get-input2 "Beschreibung" "Fenster Name" $datum  

$creationDate

allerdings liefert es mir als Rückgabe immer folgenden Wert:
GAC    Version        Location                                                                                                                                                                                                                                                                                            
---    -------        --------                                                                                                                                                                                                                                                                                            
True   v4.0.30319     C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualBasic\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualBasic.dll                                                                                                                                                                          
20.12.2023

Ich möchte aber nur das Datum haben.
Das bekomme ich auch mit folgendem kniff hin:
$creationDate=$CreationDate[1]
Ich würde das aber gerne direkt in der Funktion abstellen

Ich habe auch noch eine andere Lösung gebaut, die ebenfalls funktioniert, allerdings sieht es für mich so aus, als ob sich wegen der Abfrage immer wieder meine Powershell aufhängt. Deshalb möchte ich mal eine andere Variante probieren.
Hier meine andere Funktion

function Get-Input ([String]$WindowName,$Textfeld,$Vorschlag)
{
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    $form = New-Object System.Windows.Forms.Form
    $form.Text = $WindowName
    $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 = $Textfeld
    $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)
    $textBox.Text = $Vorschlag
    $form.Controls.Add($textBox)

    $form.Topmost = $true

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

    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
        {
            $x = $textBox.Text
            $x
        }
}

Viele Grüße
Nagus

Content-ID: 82972768029

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

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

10138557388
Lösung 10138557388 20.12.2023 aktualisiert um 13:22:08 Uhr
Goto Top
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')    
ändern in
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')    
alternativ
Add-Type -AssemblyName Microsoft.VisualBasic
Denn du gibst das sonst ebenfalls aus der Funktion Wert zurück, alles was du darin ausgibst ist der Rückgabewert der Funktion.

Oder gleich das Laden des Assemblies aus der Funktion raus lassen und vorher einmal laden
$datum = Get-Date -Format "dd.MM.yyyy"  
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')  

function get-input2 ([String]$Advice,[String]$Boxname,$Hint){
    return [Microsoft.VisualBasic.Interaction]::InputBox($Advice, $boxname, $hint)
}

$CreationDate = get-input2 "Beschreibung" "Fenster Name" $datum  
$creationDate


Eine Komfortablere Datumsauswahl wäre das hier:

function GetDateInput {
    Add-Type -A System.Windows.Forms
    $form = New-Object System.Windows.Forms.Form -P @{ClientSize = '200,80';Text = "Datum wählen"}  
    $dtpicker = New-Object System.Windows.Forms.DateTimePicker -P @{Location = '10,10';Size = '180,20';Anchor = 'Top,Left,Right'}  
    $btn = New-Object System.Windows.Forms.Button -P @{Text = "OK";Location = '10,40';Size = '180,30';Anchor = 'Bottom,Left,Right';add_Click = {$form.Close()}}  
    $form.Controls.AddRange(@($dtpicker,$btn))
    [void]$form.ShowDialog()
    $dtpicker.Value.Date
}
$creationDate = GetDateInput
$creationDate
pj
Nagus
Nagus 20.12.2023 um 14:23:30 Uhr
Goto Top
Sehr geil mal wieder, wenn man so schnell Hilfe bekommt! Danke!
Zitat von @10138557388:

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')    
ändern in
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')    

Das funktioniert perfekt - Danke! Was genau bewirkt das Void vor dem Aufruf? Ich habe mich inzwischen recht gut in PS eingefuchst, aber das sind Tiefen wo ich verloren bin ....

alternativ
Add-Type -AssemblyName Microsoft.VisualBasic
Damit komme ich im Moment erstmal nicht zurecht. Bei wirft das noch immer den ganzen Rückgabewert aus .... muss ich noch ein bisserl experimentieren um das damit hinzubekommen.
Denn du gibst das sonst ebenfalls aus der Funktion Wert zurück, alles was du darin ausgibst ist der Rückgabewert der Funktion.

Oder gleich das Laden des Assemblies aus der Funktion raus lassen und vorher einmal laden
$datum = Get-Date -Format "dd.MM.yyyy"  
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')  

function get-input2 ([String]$Advice,[String]$Boxname,$Hint){
    return [Microsoft.VisualBasic.Interaction]::InputBox($Advice, $boxname, $hint)
}

$CreationDate = get-input2 "Beschreibung" "Fenster Name" $datum  
$creationDate


Eine Komfortablere Datumsauswahl wäre das hier:

function GetDateInput {
    Add-Type -A System.Windows.Forms
    $form = New-Object System.Windows.Forms.Form -P @{ClientSize = '200,80';Text = "Datum wählen"}  
    $dtpicker = New-Object System.Windows.Forms.DateTimePicker -P @{Location = '10,10';Size = '180,20';Anchor = 'Top,Left,Right'}  
    $btn = New-Object System.Windows.Forms.Button -P @{Text = "OK";Location = '10,40';Size = '180,30';Anchor = 'Bottom,Left,Right';add_Click = {$form.Close()}}  
    $form.Controls.AddRange(@($dtpicker,$btn))
    [void]$form.ShowDialog()
    $dtpicker.Value.Date
}
$creationDate = GetDateInput
$creationDate
Die Datumsauswahl ist genial - die werde ich in dem speziellen Fall verwenden! Danke!!
Thx
Nagus
10138557388
10138557388 20.12.2023 aktualisiert um 14:36:26 Uhr
Goto Top
Zitat von @Nagus:
Das funktioniert perfekt - Danke! Was genau bewirkt das Void vor dem Aufruf?
[void] ist ein spezieller Typ und bedeutet einfach "nichts von dem Aufruf zurückgeben".

Es geht auch mit Out-Null
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')  | out-null  
Das macht das Gleiche.

Wenn du mal mit c# programmierst siehst du oft sowas:
void main(){}
hier bedeutet das Keyword "void" ebenfalls das die Funktion "main" keinen Rückgabewert hat.

Powershell basiert auf dem NET-Framework. Deswegen ist C# hier sehr eng verwand.
Damit komme ich im Moment erstmal nicht zurecht. Bei wirft das noch immer den ganzen Rückgabewert aus ....
Kann ich nicht bestätigen. Add-Type gibt nichts zurück.

Siehe Doku zu Add-Type
Ausgaben
None
Standardmäßig gibt dieses Cmdlet keine Ausgabe zurück.

Macht aber nichts, Add-Type macht am Ende das Gleiche wie LoadWithPartialName nur etwas abgewandelt und es ist erst ab Powershell 3.0 vorhanden.