首页 > 解决方案 > 我的表单上的 OK 按钮在第一次启动时不显示,如果我重新启动它会显示

问题描述

我有一个创建表单的脚本,并且每次运行脚本时都应该让 OK 按钮变灰,但是,我必须运行脚本两次才能显示 OK。不知道发生了什么。 缺少确定按钮

可变面积
Import-Module (Join-Path $(Split-Path $env:SMS_ADMIN_UI_PATH) ConfigurationManager.psd1)
Import-Module ActiveDirectory
文件名设置-OSDComputerNamePrompt-TST.ps1
# Below is one of the Array's I'm adding    
$ADSites=@("S01","S02","S03")
# Import-Module ActiveDirectory
# $ADSites = (Get-ADReplicationSite -filter *).Name
我无法让 Get-ADReplicationSite 在 WinPE 中工作
$ADSiteS01=@("AAA","BBB","CCC")
$ADSiteS02=@("DDD","EEE","FFF")
$ADSiteS03=@("GGG","HHH","JJJ")
创建表格
$Form = New-Object System.Windows.Forms.Form
$Form.Size = New-Object System.Drawing.Size(425,250)
$Form.MinimumSize = New-Object System.Drawing.Size(425,250)
$Form.MaximumSize = New-Object System.Drawing.Size(425,250)
$Form.StartPosition = "CenterScreen"
$Form.SizeGripStyle = "Hide"
$Form.FormBorderStyle = "FixedToolWindow"
$Form.Text = "Just a Form"
$Form.TopMost = $true
创建组合框
$Combobox1 = New-Object System.Windows.Forms.Combobox
$Combobox1.Location = '26,25'
$Combobox1.Size = '105,20'
$Combobox1.items.AddRange($ADSites)
$combobox2 = New-Object System.Windows.Forms.Combobox
$combobox2.Location = '143,25'
$combobox2.Size = '105,20'
$Form.Controls.Add($combobox1)
$Form.Controls.Add($combobox2)
创建文本框
$textBoxFPS = New-Object System.Windows.Forms.TextBox 
$textBoxFPS.Location = '26,75'
$textBoxFPS.Size = '55,20'
$textBoxFPS.Text = 'Test'
$form.Controls.Add($textBoxFPS)
控制可以在文本框中输入的内容
$textBoxFPS.MaxLength = 6
$textBoxFPS.Add_TextChanged({
$this.text = $this.Text -replace '\D'})
$form.Controls.Add($textBoxFPS)
为组合框添加标签
$lbADSub = New-Object System.Windows.Forms.Label
$lbADSub.Text = "Select AD Site"
$lbADSub.Top = 5
$lbADSub.Left = 26
$lbADSub.Autosize = $true
$form.Controls.Add($lbADSub)
$lbDeptSub = New-Object System.Windows.Forms.Label
$lbDeptSub.Text = "Select Department"
$lbDeptSub.Top = 5
$lbDeptSub.Left = 143
$lbDeptSub.Autosize = $true
$form.Controls.Add($lbDeptSub)
$lbFPSSub = New-Object System.Windows.Forms.Label 
$lbFPSSub.Text = "Asset Tag (Only Numbers Allowed)"
$lbFPSSub.Top = 55
$lbFPSSub.Left = 26
$lbFPSSub.Autosize = $true
$form.Controls.Add($lbFPSSub)
复选框
$chkThis = New-Object Windows.Forms.checkbox
$chkThis.Text = "Verify New Computer Name"
$chkThis.Left = 26
$chkThis.Top = 105
$chkThis.AutoSize = $true
$chkThis.Checked = $false
$form.Controls.Add($chkThis)
选择标签
$labelClub = New-Object System.Windows.Forms.Label
$labelClub.Location = '20,130'
$labelClub.Size = '280,20'
$labelClub.Text = "-"
$form.Controls.Add($labelClub)
创建确定和取消按钮
$buttonPanel = New-Object Windows.Forms.Panel
$buttonPanel.Size = New-Object Drawing.Size @(400,40)
$buttonPanel.Dock = "Bottom"
创建确定按钮
$okButton = New-Object Windows.Forms.Button
$okButton.Top = $cancelButton.Top
$okButton.Left = $cancelButton.Left - $okButton.Width - 5
$okButton.Text = "Ok" 
$okButton.DialogResult = "Ok" 
$okButton.Anchor = "Left" 
$okButton.Enabled = $false
创建取消按钮
$cancelButton = New-Object Windows.Forms.Button
$cancelButton.Left = $buttonPanel.Height - $cancelButton.Height - 10
$cancelButton.Left = $buttonPanel.Width - $cancelButton.Width - 10
$cancelButton.Text = "Cancel"
$cancelButton.DialogResult = "Cancel"
$cancelButton.Anchor = "Right"
将按钮添加到按钮面板
$buttonPanel.Controls.Add($okButton)
$buttonPanel.Controls.Add($cancelButton)
将按钮面板添加到表单
$form.Controls.Add($buttonPanel) 
设置按钮的默认操作
$form.AcceptButton = $okButton
$form.CancelButton = $cancelButton
现在我们在 Combobox 1 更改时填充 Combobox 2
$ComboBox1.add_SelectedIndexChanged({
$ComboBox2.Items.Clear() 
$combobox2.Text = $null  
Switch ($ComboBox1.Text) {
"S01"{
$ADSiteS01 | ForEach { 
$combobox2.Items.Add($_)
}}
"S02"{
$ADSiteS02 | ForEach {
$combobox2.Items.Add($_)
}}
"S03"{
$ADSiteS03 | ForEach {
$combobox2.Items.Add($_)
}}}
$labelClub.Text = $combobox1.Text + "-" + $combobox2.Text + "-" + $textBoxFPS.Text
})

$ComboBox2.add_SelectedIndexChanged({
$labelClub.Text = $combobox1.Text + "-" + $combobox2.Text + "-" + $textBoxFPS.Text
})

$textBoxFPS.add_TextChanged({
$labelClub.Text = $combobox1.Text + "-" + $combobox2.Text + "-" + $textBoxFPS.Text
})
当复选框的状态改变时做一些事情
$chkThis.Add_CheckStateChanged({
If ($chkThis.Checked) {
$okButton.enabled = $true
}
Else {
$okButton.enabled = $true
}})

$Form.ShowDialog()

标签: powershell

解决方案


根据 Theo 和我上面的评论,请添加Set-StrictMode -Version Latest到脚本的顶部。
看看原因:

$v1 = 2 + $v2
$v1

Set-StrictMode -Version Latest
$v1 = 2 + $v2
$v1

这可能无法完全解决您的问题,但如果您的代码使用未初始化的变量(如果您以特定顺序运行代码段),则会出现错误(并有助于避免陷入其他问题,请参阅https://docs.microsoft.com /en-us/powershell/module/microsoft.powershell.core/set-strictmode?view=powershell-6)。


推荐阅读