Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >POWERSHELL:无法将第二个DropDownBox选择作为变量传递

POWERSHELL:无法将第二个DropDownBox选择作为变量传递
EN

Stack Overflow用户
提问于 2020-07-16 18:57:33
回答 1查看 28关注 0票数 0

这是一个自动化的SQL备份例程...

此过程应列出SQL服务器名称(基于对数据库的查询)...你在第一个框中选择一个...

然后,基于该选择,它仅在第二个框中显示该SQL服务器上的数据库...

有几个文本框,它们可以正常工作。

然后,它将这些值向下传递到备份例程所在的代码底部,执行该例程,然后发送一封电子邮件。

我从第一个下拉列表中选择一个服务器,单击按钮将该选择‘设置’为一个变量,然后对数据库的查询使用第一个框中的值来仅显示该server...and上的数据库。正确的数据库列表将填充到第二个下拉列表中。

我的问题是,我不知道如何正确地添加第二个按钮,将第二个下拉框中的选项设置为稍后在备份例程中使用的变量。因此,不会将任何值传递给代码底部的$DBName变量,因此它不知道要备份哪个数据库,因此失败。

如有任何建议,我们将不胜感激。

代码语言:javascript
运行
AI代码解释
复制
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName Microsoft.VisualBasic
 
$form = New-Object System.Windows.Forms.Form
 
$image = [System.Drawing.Image]::Fromfile('Path to image')    
$pictureBox = new-object Windows.Forms.PictureBox  #--instantiates a PictureBox
$pictureBox.width=420
$pictureBox.height=420
$pictureBox.top=20
$pictureBox.left=350
$pictureBox.Image=$image
 
#$form.Font = New-Object System.Drawing.Font("Lucida Console",11,[System.Drawing.FontStyle]::Regular)
 
$form = New-Object System.Windows.Forms.Form
$form.Text = 'MSSQL DATABASE BACKUP UTILITY'
$form.Size = New-Object System.Drawing.Size(800,500)
$form.Font = New-Object System.Drawing.Font("Times New Roman",11,[System.Drawing.FontStyle]::Regular)
$form.StartPosition = 'CenterScreen'
$form.Controls.add($pictureBox)
 
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(10,400)
$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)
 
#first DROPDOWN Box
$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 = 'SQL Instance Name'
$form.Controls.Add($label)

$DropDownBox = New-Object System.Windows.Forms.ComboBox
$DropDownBox.Location = New-Object System.Drawing.Size(10,40)
$DropDownBox.Size = New-Object System.Drawing.Size(260,20)
$DropDownBox.DropDownHeight = 200
$Form.Controls.Add($DropDownBox)

$wksList= invoke-sqlcmd -query "select * from VIEW NAME
    order by instance_name" -database DBA -serverinstance INSTANCE_NAME

 
foreach ($wks in $wksList)
    { $DropDownBox.Items.Add($wks.Instance_Name) }
 
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(10,80)
$Button.Size = New-Object System.Drawing.Size(120,23)
$Button.Text = "Set Instance"

$Form.Controls.Add($Button)

#Add Button event
 $Button.Add_Click(
{   
    #second DROPDOWN Box
    $InstanceName = $DropDownBox.SelectedItem
    $label2 = New-Object System.Windows.Forms.Label
    $label2.Location = New-Object System.Drawing.Point(10,120)
   $label2.Size = New-Object System.Drawing.Size(280,20)
    $label2.Text = 'Database Name'
    $form.Controls.Add($label2)

    $DropDownBox2 = New-Object System.Windows.Forms.ComboBox
    $DropDownBox2.Location = New-Object System.Drawing.Size(10,140)
    $DropDownBox2.Size = New-Object System.Drawing.Size(260,20)
    $DropDownBox2.DropDownHeight = 200
    $Form.Controls.Add($DropDownBox2)

    $wksList2= invoke-sqlcmd -query "select name from sys.databases
    where database_id>4
    order by name" -database MASTER -serverinstance $InstanceName

    foreach ($wks in $wksList2)
        { $DropDownBox2.Items.Add($wks.name) }

})

#end second DROPDOWN box
 
# third text box
$label3 = New-Object System.Windows.Forms.Label
$label3.Location = New-Object System.Drawing.Point(10,220)
$label3.Size = New-Object System.Drawing.Size(280,20)
$label3.Text = 'Desired Backup Location'
$form.Controls.Add($label3)
 
$textBox3 = New-Object System.Windows.Forms.TextBox
$textBox3.Location = New-Object System.Drawing.Point(10,240)
$textBox3.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox3)
#end third text box
 
# fourth text box
$label4 = New-Object System.Windows.Forms.Label
$label4.Location = New-Object System.Drawing.Point(10,280)
$label4.Size = New-Object System.Drawing.Size(280,20)
$label4.Text = 'Desired Backup Name'
$form.Controls.Add($label4)
 
$textBox4 = New-Object System.Windows.Forms.TextBox
$textBox4.Location = New-Object System.Drawing.Point(10,300)
$textBox4.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox4)
#end fourth text box
 
# fifth text box
$label5 = New-Object System.Windows.Forms.Label
$label5.Location = New-Object System.Drawing.Point(10,340)
$label5.Size = New-Object System.Drawing.Size(280,20)
$label5.Text = 'Your Email Address'
$form.Controls.Add($label5)
 
$textBox5 = New-Object System.Windows.Forms.TextBox
$textBox5.Location = New-Object System.Drawing.Point(10,360)
$textBox5.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox5)
#end fifth text box
 
$form.Topmost = $true
 
$form.Add_Shown({$DropDownBox.Select()})
$result = $form.ShowDialog()
 
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$Server = $DropDownBox.text
$DBName = $DropDownBox2.text
$SharedFolder = $textBox3.text
$BUName = $textBox4.text
$mail = $textBox5.text
 
Get-Variable
 
   <#$Date = Get-Date -format yyyyMMdd#>
Backup-SqlDatabase  -ServerInstance $server `
                    -Database $DBName `
                    -CopyOnly `
                    -CompressionOption on `
                    -BackupFile "$($SharedFolder)\$DBName-$BUName.bak" `
                    -BackupAction Database `
                    -checksum
 
#SMPT Section
 
$From = "SUPPORT EMAIL"
$To = $mail
$Subject = "RECENT MSSQL BACKUP REQUEST"
$Body = "Your MSSQL database backup from $server, $DBName, has been backed up to $SharedFolder. Please check the directory path you specified for your backup. If you have any problems, fwd this email to SUPPORT EMAIL for assistance."
$PSEmailServer = "SMTP SERVER"
 
Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -SmtpServer $PSEmailserver
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-16 19:46:10

你可能想要有一个C#或VB版本的参考。您不会在PowerShell中找到许多使用WinForms的示例。特别是,您可能希望了解布局面板,而不是对所有控件使用固定的位置和大小。

无论如何,这里的问题是您在OnClick事件中动态添加组合框,并且在对话框关闭后实际上没有对它的引用。你可以一直使用find a control by its name,但是如果你有引用每个控件的变量(它应该有比ComboBox2更好的名字,等等),那么通常不需要这样做。

代码语言:javascript
运行
AI代码解释
复制
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName Microsoft.VisualBasic
 
$form = New-Object System.Windows.Forms.Form
 
#$image = [System.Drawing.Image]::Fromfile('Path to image')    
$pictureBox = new-object Windows.Forms.PictureBox  #--instantiates a PictureBox
$pictureBox.width=420
$pictureBox.height=420
$pictureBox.top=20
$pictureBox.left=350
#$pictureBox.Image=$image
 
#$form.Font = New-Object System.Drawing.Font("Lucida Console",11,[System.Drawing.FontStyle]::Regular)
 
$form = New-Object System.Windows.Forms.Form
$form.Text = 'MSSQL DATABASE BACKUP UTILITY'
$form.Size = New-Object System.Drawing.Size(800,500)
$form.Font = New-Object System.Drawing.Font("Times New Roman",11,[System.Drawing.FontStyle]::Regular)
$form.StartPosition = 'CenterScreen'
$form.Controls.add($pictureBox)
 
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(10,400)
$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)
 
#first DROPDOWN Box
$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 = 'SQL Instance Name'
$form.Controls.Add($label)

$DropDownBox = New-Object System.Windows.Forms.ComboBox
$DropDownBox.Location = New-Object System.Drawing.Size(10,40)
$DropDownBox.Size = New-Object System.Drawing.Size(260,20)
$DropDownBox.DropDownHeight = 200
$Form.Controls.Add($DropDownBox)

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(10,80)
$Button.Size = New-Object System.Drawing.Size(120,23)
$Button.Text = "Set Instance"

$Form.Controls.Add($Button)

$DropDownBox2 = New-Object System.Windows.Forms.ComboBox
$DropDownBox2.Location = New-Object System.Drawing.Size(10,140)
$DropDownBox2.Size = New-Object System.Drawing.Size(260,20)
$DropDownBox2.DropDownHeight = 200
$Form.Controls.Add($DropDownBox2)

#end second DROPDOWN box
 
# third text box
$label3 = New-Object System.Windows.Forms.Label
$label3.Location = New-Object System.Drawing.Point(10,220)
$label3.Size = New-Object System.Drawing.Size(280,20)
$label3.Text = 'Desired Backup Location'
$form.Controls.Add($label3)
 
$textBox3 = New-Object System.Windows.Forms.TextBox
$textBox3.Location = New-Object System.Drawing.Point(10,240)
$textBox3.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox3)
#end third text box
 
# fourth text box
$label4 = New-Object System.Windows.Forms.Label
$label4.Location = New-Object System.Drawing.Point(10,280)
$label4.Size = New-Object System.Drawing.Size(280,20)
$label4.Text = 'Desired Backup Name'
$form.Controls.Add($label4)
 
$textBox4 = New-Object System.Windows.Forms.TextBox
$textBox4.Location = New-Object System.Drawing.Point(10,300)
$textBox4.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox4)
#end fourth text box
 
# fifth text box
$label5 = New-Object System.Windows.Forms.Label
$label5.Location = New-Object System.Drawing.Point(10,340)
$label5.Size = New-Object System.Drawing.Size(280,20)
$label5.Text = 'Your Email Address'
$form.Controls.Add($label5)
 
$textBox5 = New-Object System.Windows.Forms.TextBox
$textBox5.Location = New-Object System.Drawing.Point(10,360)
$textBox5.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox5)
#end fifth text box


#event handlers
#Add Button event
 $Button.Add_Click(
{   
    #second DROPDOWN Box
    $InstanceName = $DropDownBox.SelectedItem
    $label2 = New-Object System.Windows.Forms.Label
    $label2.Location = New-Object System.Drawing.Point(10,120)
   $label2.Size = New-Object System.Drawing.Size(280,20)
    $label2.Text = 'Database Name'
    $form.Controls.Add($label2)


    $wksList2= invoke-sqlcmd -query "select name from sys.databases
    where database_id>4
    order by name" -database MASTER -serverinstance $InstanceName

    foreach ($wks in $wksList2)
        { $DropDownBox2.Items.Add($wks.name) }

})


#Initialize
$wksList= invoke-sqlcmd -query "select * from VIEW NAME
    order by instance_name" -database DBA -serverinstance INSTANCE_NAME

 
foreach ($wks in $wksList)
    { $DropDownBox.Items.Add($wks.Instance_Name) }

 
$form.Topmost = $true
 
$form.Add_Shown({$DropDownBox.Select()})

#show form and wait for input
$result = $form.ShowDialog()
 
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $Server = $DropDownBox.text
    $DBName = $DropDownBox2.text
    $SharedFolder = $textBox3.text
    $BUName = $textBox4.text
    $mail = $textBox5.text
 
    write-output $DropDownBox2
    Write-Output "Db $DbName"

 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62941759

复制
相关文章
React技巧之将CSS作为props传递
原文链接:https://bobbyhadz.com/blog/react-pass-style-as-props-typescript[1]
chuckQu
2022/08/19
2.6K0
React技巧之将CSS作为props传递
React技巧之将函数作为props传递
原文链接:https://bobbyhadz.com/blog/react-typescript-pass-function-as-prop[1]
chuckQu
2022/08/19
1K0
React技巧之将函数作为props传递
C++返回vector/将vector作为参数传递
在C++里很多时候我们会遇到函数想返回两个以上结果的情况,这时候可以用数组(vector)、类来作为容器返回,也可以声明一个全局变量的数组,将数值存放在数组里解决。
vincentbbli
2021/08/18
5.6K0
Vue 中,如何将函数作为 props 传递给组件
作者:Michael Thiessen 译者:前端小智 来源:medium 点赞再看,养成习惯本文 GitHub https://github.com/qq44924588... 上已经收录,更多往
前端小智@大迁世界
2020/05/18
8.4K0
Powershell中的变量
在我们的迷你系列“Variables in Shells”中,了解如何在PowerShell中处理局部变量。
QRosie
2019/11/24
3.1K0
Powershell中的变量
为什么将Salesforce作为你的职业选择
Salesforce提供功能完善的销售,市场,服务,协同,安全以及分析功能,同时你还可以在Salesforce1的平台上创建自己的解决方案。Salesforce适合从初创企业到世界500强的不同规模企业使用。
臭豆腐
2019/04/16
8950
为什么将Salesforce作为你的职业选择
Python 函数作为参数传递
#map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作数据 def test_func_map():     re = map((lambda x: x+3), [1, 2, 3, 4])     print re def testA(a, b, **kargs):     print a+b     print "testA: %s" % kargs #函数作为参数传递 def test_func(func, a, b, **kargs):     func(a, b)     print "test_func: %s" % kargs #函数作为参数传递 def test_func_lambda(func, **kargs):     func()     print "test_func_lambda: %s" % kargs def test_func_getattr():     func = getattr(obj, "testA")     func(1, 2) class TestGetattr():     aa = "2a"     def get_attr(self):         print "test getattr()"     def print_text(self):         print "print text"     def print_string(self):         print "print string" #getattr(obj, "a")的作用和obj.a是一致的,但该方法还有其他的用处,最方便的就是用来实现工厂方法 #根据传入参数不同,调用不同的函数实现几种格式的输出 def output(print_type="text"):     tg = TestGetattr()     output_func = getattr(tg, "print_%s" % print_type)     output_func() if __name__ == "__main__":     #test_func(testA, 1, 2, aa="aa")     #test_func_lambda((lambda: testA(1, 2, bb="bb")), cc="cc")     #test_func_map()     #test_func_getattr()     #getattr方法,传入参数是对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例     obj = TestGetattr()     func = getattr(obj, "get_attr") #getattr()获得对象的属性和方法     func()     print getattr(obj, "aa") #完成对象的反射     print obj.aa     #callable方法,如果传入的参数是可以调用的函数,则返回true,否则返回false。     print callable(getattr(obj, "aa"))     output("string")
py3study
2020/01/09
3.1K0
选择篇(094)-哪个选项是将hasName设置为true的方法,前提是不能将true作为参数传递?
使用逻辑非运算符!,将返回一个布尔值,使用!! name,我们可以确定name的值是真的还是假的。如果name是真实的,那么!name返回false。 !false返回true。
齐丶先丶森
2022/12/05
2.2K0
临时变量作为非const的引用进行参数传递引发的编译错误
Linux环境运行,使用g++编译,观察如下代码,会出现: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’的错误。
恋喵大鲤鱼
2018/08/03
2.6K0
Go-函数作为参数传递
编码过程中业务需要将一个函数,作为参数传递到函数内部。Go 语言的匿名函数是一个闭包(Closure)
王小明_HIT
2023/03/01
1.7K0
Go-函数作为参数传递
python argparse 无法传递bool
在使用argparse时发现无法传递bool型变量,无论命令行输入True还是False,解析出来之后都是True,代码如下
羽翰尘
2019/11/19
1.7K0
shell 循环变量传递问题
定义为环境变量没有用的,环境变量只是在子进程创建的时候可以从父进程复制到子进程,它无法实现从子进程往父进程传递,也不能在子进程运行期间从父进程获得新值。
全栈程序员站长
2022/09/15
9840
通过 JavaScrpit 传递 Post 变量
使用 Get 方式方式传递变量会把 URL 搞得很长,而且 IE 会对长度有限制,所以最好的方式还是通过 Post 方式来传递变量。但是通过 Post 来传递变量的时候一定要有个表单,很多时候页面上并没有表单,所以这个时候可以隐藏表单,然后通过 JavaScript 来提交表单。下面是个隐藏表单的例子:
Denis
2023/04/13
7230
linux/bash:map作为参数传递给function
在linux bash中map是作为数组处理的,不能作为参数直接传递函数,如果一定要传递给函数,要做一些变通处理,示例如下:
10km
2019/08/14
2.7K0
【Python】函数进阶 ③ ( 函数作为参数传递 )
之前介绍的函数 , 都是 接收具体的 变量 或 字面量 数据 作为参数 , 如 : 数字 / 布尔值 / 字典 / 列表 / 元组 等 ;
韩曙亮
2023/10/11
5460
【Python】函数进阶 ③ ( 函数作为参数传递 )
PowerShell: 作为一个PowerShell菜鸟,如何快速入门?掌握这些就够了「建议收藏」
可能大家看到这个标题要说我是标题党了,不过没关系了。这篇文章算是我的处女作,所以再怎么花哨我都不觉得过分。好啦,废话不多讲。
全栈程序员站长
2022/11/01
5.1K0
PowerShell: 作为一个PowerShell菜鸟,如何快速入门?掌握这些就够了「建议收藏」
Python 模块之间传递变量
最近在做实验时发现个问题,我想在一个模块中调用另一个模块的变量,首先想到了用return 
py3study
2020/01/10
3.8K0
『debug心路』powershell 中无法激活 conda 环境
工作需求原因,拿到一台新电脑,首先需要安装 python 。一般地,我用 conda 管理自己的 python 环境。
Piper蛋窝
2021/02/12
4.8K0
『debug心路』powershell 中无法激活 conda 环境
将PowerShell脚本编码到PNG文件
Invoke-PSImage接收一个PowerShell脚本,并将脚本的字节编码为PNG图像的像素。它生成一个oneliner,用于从文件或从网络上执行。
Khan安全团队
2021/03/10
1.4K0
下篇1:将 ConfigMap 中的键值对作为容器的环境变量
继续接上篇,《一文了解K8S的ConfigMap》。上篇聊过,官方文档中提到的可以使用下面4种方式来使用 ConfigMap 配置 Pod 中的容器:
不背锅运维
2023/05/26
2.3K0
下篇1:将 ConfigMap 中的键值对作为容器的环境变量

相似问题

将PowerShell变量作为cmdlet参数传递

45

Powershell -无法将变量传递给commandlet

118

将path作为powershell脚本中的变量传递

20

将组合框选择作为变量传递?

31

将变量作为Powershell中的开关参数传递

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档