Courriel PowerShell avec saisie de texte

2

J'essaie d'écrire un script qui génère quatre zones de texte et enregistre les valeurs saisies dans quatre variables, chacune représentant un nom d'utilisateur, un code PIN de téléphone, un code PIN de messagerie vocale et une extension de téléphone. Une fois rempli, il envoie le courrier électronique qui utilise les variables sont des espaces réservés où chaque valeur doit apparaître.

J'ai masqué et supprimé une partie du code d'anonymat, mais j'espère qu'il le lit toujours de manière logique.

Le script fonctionne partiellement, mais avec une faille bizarre que je ne peux pas identifier.

Lors de l’ exécution initiale , le script génère les 4 zones de saisie de texte et effectue avec succès un hôte d’écriture, affichant le résultat des données saisies dans les zones de saisie de texte (par exemple, fred.bloggs, 1000, 1000, 1000) - Prouver que l’utilisateur les données entrées sont en cours d'enregistrement dans les variables. Il envoie ensuite l'e-mail, mais TOUS les champs de variable sont vides lorsque je reçois l'e-mail. (Je teste en mettant mon propre nom d'utilisateur dans la zone de saisie Nom d'utilisateur.)

Si je lance le script une seconde fois, le script lève les 4 cases, écrit avec succès l'hôte en affichant les nouvelles valeurs (par exemple, fred.bloggs, 1001, 1001, 1001) enregistrées pour chaque variable, puis envoie le courrier électronique - Mais, l'e-mail contient les valeurs que j'ai entrées lors de la première exécution du script. (fred.blogs, 1000, 1000, 1000)

Je reçois donc des variables vierges dans le courrier électronique lorsque je l'exécute pour la première fois (par exemple, si je ferme Powershell_ISE et que je le rouvre). Et je saisis les valeurs précédentes si je le lance une seconde fois. Il semble que chaque fois que je lance le script, il envoie toujours le courrier électronique en utilisant les valeurs de la tentative précédente.

Alors c'est comme ça:

Tentative 1: Entré fred.bloggs, 1000, 1000, 1000 - Résultat: tout est vide dans les champs variables de l'email

Tentative 2: Entrée fred.bloggs, 1001, 1001, 1001 - Résultat: champs de variable d'e-mail renseignés avec fred.bloggs, 1000, 1000, 1000

Tentative 3: Entrée fred.bloggs, 1002, 1002, 1002 - Résultat: champs de variable d'e-mail renseignés avec fred.bloggs, 1001, 1001, 1001

Je suppose que cela tient à la façon dont les valeurs de la zone de saisie de texte sont enregistrées par rapport aux variables, mais je ne trouve pas le problème.

Le code est comme ci-dessous. Toute aide serait extrêmement appréciée, car j’apprends beaucoup avec Powershell.

$EmailFrom = "[email protected]"
$EmailSubject = "Welcome to obscured + On-Boarding Details"
$SMTPServer = "obscured"
$SMTPPassword = Get-Content .\mailpw.txt | ConvertTo-SecureString
$SMTPCred = New-Object System.Management.Automation.PSCredential "MailUser",
$SMTPPassword
$EmailBody = @"

Hi $StarterName,

Log in with obscured\$StarterName

Your Personalised details:
Username: $StarterName<Br>
Email:  [email protected]<Br>
Phone Extension: $PhoneExt (+obscured $PhoneExt) Dial 0 for external calls.    <Br>
Phone Username: $StarterName<Br>
Phone PIN: $PhonePin <Br>
Voicemail PIN: $VMPin <Br>

"@

#INPUT BOX: STARTER USER NAME

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$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 = 'Enter Starter UserName:'
$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)

$form.Topmost = $true

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

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

#INPUT BOX: PHONE EXTENSION

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$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 = 'Enter Starter Phone Extension'
$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)

$form.Topmost = $true

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

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

#INPUT BOX: PHONE PIN

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$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 = 'Enter Starter Phone PIN:'
$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)

$form.Topmost = $true

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

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

#INPUT BOX: VM PIN

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$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 = 'Enter Starter Voicemail PIN:'
$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)

$form.Topmost = $true

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

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


Write-Host "Sending email to [email protected]" -ForegroundColor Green
Write-Host "PhoneExt: $PhoneExt" -ForegroundColor Green
Write-Host "Phone PIN: $PhonePIN" -ForegroundColor Green
Write-Host "Voicemail PIN: $VMPin" -ForegroundColor Green

Send-MailMessage -Credential $SMTPCred -To "$StarterName@obscured" -From 
$EmailFrom -Subject $EmailSubject -SmtpServer $SMTPServer -Body $EmailBody -BodyAsHtml
David Shortall
la source

Réponses:

2

Je ne connais pas Powershell, mais je suppose que les variables sont interpolées en chaîne quand elle est définie, non utilisée.

Déplacer la $EmailBodydéfinition vers le bas, sous le code de saisie.

Les exécutions ultérieures fonctionnent, mais avec des valeurs obsolètes, car les variables sont conservées entre les exécutions par shell.

Gronostaj
la source
4

Pourquoi s'agit-il de 4 boîtes de dialogue par rapport à une seule instance d'interface graphique?

Ce que vous faites est vraiment excessif pour ce que vous recherchez

Si vous récupérez les données variables précédentes dans l'ISE, c'est parce que vous ne les avez pas effacées avant de les utiliser à nouveau, elles sont toujours en mémoire.

Les variables remplies ne sont pas effacées automatiquement. Donc, vous devez explicitement les vider ainsi que quitter, fermer le ramasse-miettes tout ce que vous avez instancié ou redémarrer l’environnement ISE / dev qui n’est en tout cas qu’une mise au point.

Que vous utilisiez un formulaire ou non, vous devez toujours nettoyer / effacer les éléments supprimés avant de pouvoir les utiliser à nouveau. Cela peut arriver avec n’importe quel langage de programmation, donc pas d’activité spécifique à PS ni à ISE.

Tout cela semble indiquer que vous êtes nouveau dans le développement d’interface graphique PS ou dans l’application de développement en général. Il existe de nombreuses vidéos sur YouTube qui traitent de la création d'interface graphique pour PS et de l'utilisation de WPF et de WinForms, ainsi que de nombreux articles sur le Web.

Vous n'avez même pas besoin d'un formulaire personnalisé, à moins que vous ne fassiez du branding. Vous pouvez simplement faire ça.

Utilisez une interface graphique PS simpliste (à l'aide de la cmdlet Show-Command) et entrez les informations qui, lorsque vous cliquez sur Exécuter, les envoient à la cmdlet Send-MailMessage en tant que fonction. Les seuls inconvénients ici sont, il est fonctionnel, pas joli, et vous ne pouvez pas commander les paramètres. D'où mon point de marque ci-dessus.

Exemple:

function New-UserOnboardingEmail
    {
        param
        (
            [Parameter(Mandatory)]
            [string]$Username,

            [Parameter(Mandatory)]
            [string]$PhonePin,

            [Parameter(Mandatory)]
            [string]$VoicemailPin,

            [Parameter(Mandatory)]
            [string]$PhoneExt
        )


        $UserOnBoardDetails =  "
        UserName  : $Username`n
        PhonePin  : $PhonePin`n
        VoiceMail : $VoicemailPin`n
        PhoneExt  : $PhoneExt"

        Send-MailMessage `
        -From "[email protected]" `
        -To "[email protected]" `
        -Subject 'Welcome to obscured + On-Boarding Details' `
        -Body: $UserOnBoardDetails `
        -SmtpServer $SmtpServer `
        -Encoding UTF8 `
        -Credential $Creds
    }

Show-Command -Name New-UserOnboardingEmail

Pour ce faire dans un seul formulaire, utilisez https://poshgui.com , faites glisser le concepteur de formulaire par glisser-déposer, puis attachez simplement votre code derrière pour le faire passer à l'action.

En ce qui concerne votre code, vous devez transmettre la valeur de l'entrée de zone de texte pour pouvoir l'utiliser sur un événement de clic de bouton.

Exemple utilisant ce concepteur d'interface graphique en ligne

<# This form was created using POSHGUI.com  a free online gui designer for PowerShell
.NAME
    Untitled
#>

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

#region begin GUI{ 

$frmUserOnBoarding               = New-Object system.Windows.Forms.Form
$frmUserOnBoarding.ClientSize    = '400,400'
$frmUserOnBoarding.text          = "New User On-boarding "
$frmUserOnBoarding.TopMost       = $false

$lblUserName                     = New-Object system.Windows.Forms.Label
$lblUserName.text                = "UserName"
$lblUserName.AutoSize            = $true
$lblUserName.width               = 25
$lblUserName.height              = 10
$lblUserName.location            = New-Object System.Drawing.Point(17,22)
$lblUserName.Font                = 'Microsoft Sans Serif,10'

$txtUserName                     = New-Object system.Windows.Forms.TextBox
$txtUserName.multiline           = $false
$txtUserName.width               = 100
$txtUserName.height              = 20
$txtUserName.location            = New-Object System.Drawing.Point(157,17)
$txtUserName.Font                = 'Microsoft Sans Serif,10'

$lblPhonePin                     = New-Object system.Windows.Forms.Label
$lblPhonePin.text                = "PhonePin"
$lblPhonePin.AutoSize            = $true
$lblPhonePin.width               = 25
$lblPhonePin.height              = 10
$lblPhonePin.location            = New-Object System.Drawing.Point(17,60)
$lblPhonePin.Font                = 'Microsoft Sans Serif,10'

$txtPhonePin                     = New-Object system.Windows.Forms.TextBox
$txtPhonePin.multiline           = $false
$txtPhonePin.width               = 100
$txtPhonePin.height              = 20
$txtPhonePin.location            = New-Object System.Drawing.Point(156,51)
$txtPhonePin.Font                = 'Microsoft Sans Serif,10'

$lblVoicemailPin                 = New-Object system.Windows.Forms.Label
$lblVoicemailPin.text            = "VoiceMailPin"
$lblVoicemailPin.AutoSize        = $true
$lblVoicemailPin.width           = 25
$lblVoicemailPin.height          = 10
$lblVoicemailPin.location        = New-Object System.Drawing.Point(18,94)
$lblVoicemailPin.Font            = 'Microsoft Sans Serif,10'

$txtVoicemailPin                 = New-Object system.Windows.Forms.TextBox
$txtVoicemailPin.multiline       = $false
$txtVoicemailPin.width           = 100
$txtVoicemailPin.height          = 20
$txtVoicemailPin.location        = New-Object System.Drawing.Point(157,88)
$txtVoicemailPin.Font            = 'Microsoft Sans Serif,10'

$lblPhoneExt                     = New-Object system.Windows.Forms.Label
$lblPhoneExt.text                = "PhoneExt"
$lblPhoneExt.AutoSize            = $true
$lblPhoneExt.width               = 25
$lblPhoneExt.height              = 10
$lblPhoneExt.location            = New-Object System.Drawing.Point(20,126)
$lblPhoneExt.Font                = 'Microsoft Sans Serif,10'

$txtPhoneExt                     = New-Object system.Windows.Forms.TextBox
$txtPhoneExt.multiline           = $false
$txtPhoneExt.width               = 100
$txtPhoneExt.height              = 20
$txtPhoneExt.location            = New-Object System.Drawing.Point(154,124)
$txtPhoneExt.Font                = 'Microsoft Sans Serif,10'

$btnSubmit                       = New-Object system.Windows.Forms.Button
$btnSubmit.text                  = "Submit"
$btnSubmit.width                 = 60
$btnSubmit.height                = 30
$btnSubmit.location              = New-Object System.Drawing.Point(16,168)
$btnSubmit.Font                  = 'Microsoft Sans Serif,10'

$btnCancel                       = New-Object system.Windows.Forms.Button
$btnCancel.text                  = "Cancel"
$btnCancel.width                 = 60
$btnCancel.height                = 30
$btnCancel.location              = New-Object System.Drawing.Point(87,167)
$btnCancel.Font                  = 'Microsoft Sans Serif,10'

$frmUserOnBoarding.controls.AddRange(@($lblUserName,$txtUserName,$lblPhonePin,$txtPhonePin,$lblVoicemailPin,$txtVoicemailPin,$lblPhoneExt,$txtPhoneExt,$btnSubmit,$btnCancel))

#region gui events {
$btnSubmit.Add_Click({ 
$UserName = $txtUserName.Text
$PhonePin = $txtPhonePin.Text
$VoicemailPin = $txtVoicemailPin.Text
$PhoneExt = $txtPhoneExt.Text 
$frmUserOnBoarding.Close()})
#endregion events }

#endregion GUI }


#Write your logic code here

[void]$frmUserOnBoarding.ShowDialog()


# Results from the submit button on the form
$UserName
$PhonePin
$VoicemailPin
$PhoneExt
postanote
la source
J'ai placé le contenu $ MessageBody, qui contient les variables d'entrée utilisateur, ci-dessous, dans lequel les variables sont déclarées - Dans mon script d'origine, le problème d'origine que j'ai posté était résolu avec succès - Dans un autre script, j'ai procédé de la même façon problème d'origine. Je ne vois pas ce qui est différent qui causerait cela. J'ai implémenté toutes les méthodes de suppression de variable ou d'effacement de variable que je pouvais trouver en ligne, mais aucune solution ne semble résoudre ce problème.
David Shortall