【问题标题】:Architectur and software selection improvement架构和软件选择改进
【发布时间】:2016-08-23 21:23:49
【问题描述】:

我正在编写一个脚本来为不同的部门自动安装一些软件。这是它目前的样子:

想法是有一个下拉列表,您可以在其中选择特定部门。 例如,在您选择“营销”后,程序应自动标记 x86 或 x64 架构的 Chechboxes 以及需要为该部门安装的程序。 (所以我想建一个模板,选择部门后Powershell可以调用。

到目前为止,我构建了“架构选择器”

$wmiquery = (Get-WmiObject -Class Win32_Processor | Select-Object AddressWidth)

$wmiquery = $wmiquery.AddressWidth

[string]$wmiquery2 = $wmiquery

write-host $wmiquery2

Powershell 要求架构并给出 32 或 64 作为字符串。在以前的脚本中是这样使用的。

switch ($wmiquery2) {
     "64" {
        x64
        x86_x64
     }
     "32" {
        x86
        x86_x64
     }


function x64 {
    Copy-Item -Path "#" -Destination "#"  

    Start-Process "#" /qn -Wait

    Remove-Item -Path "#"
}

function x32 {
    Copy-Item -Path "#" -Destination "#"  

    Start-Process "#" /qn -Wait

    Remove-Item -Path "#"
}

但我想这一次不会起作用:/

我还使用示例选择构建了 GUI 的测试部分。

###Windowloader
[void][reflection.assembly]::Load('mscorlib')
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$objForm = New-Object System.Windows.Forms.Form

### Height and width of window
$objForm = New-Object System.Windows.Forms.Form
$objForm.width = 400
$objForm.height = 900
$objForm.StartPosition = "CenterScreen"

### Set the font of the text to be used within the form
    $objFont = New-Object System.Drawing.Font("Times New Roman",09)
    $objForm.Font = $Font


### set objform icon
$objform.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon("#")


### set objform text
$objForm.Text = "Installmanager"



###Drowdown position, height, list
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(40,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Treffen Sie bitte eine Auswahl:"
$objForm.Controls.Add($objLabel) 

$objCombobox = New-Object System.Windows.Forms.Combobox 
$objCombobox.Location = New-Object System.Drawing.Size(10,40) 
$objCombobox.Size = New-Object System.Drawing.Size(260,20) 

[void] $objCombobox.Items.Add("IT")
[void] $objCombobox.Items.Add("Controlling")
[void] $objCombobox.Items.Add("Redaktion")
[void] $objCombobox.Items.Add("Disposition")
[void] $objCombobox.Items.Add("Grafik")
[void] $objCombobox.Items.Add("Redaktion(Schnitt)")
[void] $objCombobox.Items.Add("Sekreteriat")

$objCombobox.Height = 70
$objForm.Controls.Add($objCombobox) 
$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})

$x
### Checkboxdescrption
        ###Textbox 32 Bit
        $obj32Bit = New-Object System.Windows.Forms.Label
        $obj32Bit.Location = New-Object System.Drawing.Size(10,100) 
        $obj32Bit.Size = New-Object System.Drawing.Size(40,20) 
        $obj32Bit.Text = "32 Bit"
        $obj32Bit.Name = "32 Bit"
        $objForm.Controls.Add($obj32Bit)

        ###Textbox 64 Bit
        $obj64Bit = New-Object System.Windows.Forms.Label
        $obj64Bit.Location = New-Object System.Drawing.Size(50,100) 
        $obj64Bit.Size = New-Object System.Drawing.Size(40,20) 
        $obj64Bit.Text = "64 Bit"
        $obj64Bit.Name = "64 Bit"
        $objForm.Controls.Add($obj64Bit)

        ###Textbox application
        $objProgrammText = New-Object System.Windows.Forms.Label
        $objProgrammText.Location = New-Object System.Drawing.Size(100,100) 
        $objProgrammText.Size = New-Object System.Drawing.Size(70,20) 
        $objProgrammText.Text = "Anwendung"
        $objProgrammText.Name = "Programm"
        $objForm.Controls.Add($objProgrammText)


        ### 7zip
        $obj7zipText = New-Object System.Windows.Forms.Label
        $obj7zipText.Location = New-Object System.Drawing.Size(100,128) 
        $obj7zipText.Size = New-Object System.Drawing.Size(300,20) 
        $obj7zipText.Text = "7Zip"
        $obj7zipText.Name = "7Zip"
        $objForm.Controls.Add($obj7zipText)


        ###Java
        $objJava = new-object System.Windows.Forms.checkbox
        $objJava.Location = new-object System.Drawing.Size(20,145)
        $objJava.Size = new-object System.Drawing.Size(40,50)
        $objJava.Checked = $false
        $objForm.Controls.Add($objJava)  



    ###Checkbox Programm 32 Bit
    $obj7zip = new-object System.Windows.Forms.checkbox
    $obj7zip.Location = new-object System.Drawing.Size(20,110)
    $obj7zip.Size = new-object System.Drawing.Size(40,50)
    $obj7zip.Checked = $false
    $objForm.Controls.Add($obj7zip) **


    ###Checkbox Programm 64 Bit
    $obj7zip64 = new-object System.Windows.Forms.checkbox
    $obj7zip64.Location = new-object System.Drawing.Size(60,110)
    $obj7zip64.Size = new-object System.Drawing.Size(40,50)
    $obj7zip64.Checked = $false
    $objForm.Controls.Add($obj7zip64)

    ###Java
    $objJava = new-object System.Windows.Forms.checkbox
    $objJava.Location = new-object System.Drawing.Size(60,145)
    $objJava.Size = new-object System.Drawing.Size(40,50)
    $objJava.Checked = $false
    $objForm.Controls.Add($objJava)  


### OK Button End
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,700)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Name = "OK"
$OKButton.DialogResult = "OK"
$OKButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($OKButton) 



### OK Button Top
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Point(290, 40)
$Button.Size = New-Object System.Drawing.Size(80, 23)
$Button.Text = "OK"
$Button.add_Click(
{
    $obj7zip64.Checked = $false
    $obj7zip32.Checked = $false
    $dropdown = $objCombobox.SelectedItem.ToString()
    if ($dropdown -eq "Controlling") {
        $obj7zip64.Checked = $true
    #if ($dropdown -eq "Sekretariat") {
        #$obj7zip64.Checked = $false

#}
}
}
)


$objForm.Controls.Add($Button)


###Shows Window
[void] $objForm.ShowDialog()

在最后一个按钮(### OK 按钮顶部)我写了一个例子,到目前为止它有效。但是如果你为 20-30 种不同的软件构建这种方式,我会得到一个庞大而混乱的列表。

所以也许你对我有一个如何管理这个的想法。

【问题讨论】:

    标签: windows powershell powershell-2.0 powershell-3.0 powershell-4.0


    【解决方案1】:

    我认为您可以使用环境变量$env:ProgramW6432 进行安装,因此您根本不必确定架构,每个程序只需要一个复选框。

    对于您的软件列表,我将创建一个数组并动态创建 GUI:

    # ....
    
    [void] $objCombobox.Items.Add("IT")
    [void] $objCombobox.Items.Add("Controlling")
    [void] $objCombobox.Items.Add("Redaktion")
    [void] $objCombobox.Items.Add("Disposition")
    [void] $objCombobox.Items.Add("Grafik")
    [void] $objCombobox.Items.Add("Redaktion(Schnitt)")
    [void] $objCombobox.Items.Add("Sekreteriat")
    
    $objCombobox.Height = 70
    $objForm.Controls.Add($objCombobox) 
    $objForm.Topmost = $True
    
    $objForm.Add_Shown({$objForm.Activate()})
    
    
    $programList = @(
        '7-Zip'
        'Java'
        'Outlook'
        'SqlServer'
        'Visual Studio'
        'Skype for Business'
        'Notepad++'
        'Chrome'
        'IIS'
    )
    
    ### Checkboxdescrption
    ###Textbox 32 Bit
    $obj32Bit = New-Object System.Windows.Forms.Label
    $obj32Bit.Location = New-Object System.Drawing.Size(10,100) 
    $obj32Bit.Size = New-Object System.Drawing.Size(40,20) 
    $obj32Bit.Text = "32 Bit"
    $obj32Bit.Name = "32 Bit"
    $objForm.Controls.Add($obj32Bit)
    
    ###Textbox 64 Bit
    $obj64Bit = New-Object System.Windows.Forms.Label
    $obj64Bit.Location = New-Object System.Drawing.Size(50,100) 
    $obj64Bit.Size = New-Object System.Drawing.Size(40,20) 
    $obj64Bit.Text = "64 Bit"
    $obj64Bit.Name = "64 Bit"
    $objForm.Controls.Add($obj64Bit)
    
    ###Textbox application
    $objProgrammText = New-Object System.Windows.Forms.Label
    $objProgrammText.Location = New-Object System.Drawing.Size(100,100) 
    $objProgrammText.Size = New-Object System.Drawing.Size(70,20) 
    $objProgrammText.Text = "Anwendung"
    $objProgrammText.Name = "Programm"
    $objForm.Controls.Add($objProgrammText)
    
    
    $height = 128
    $programList | ForEach-Object {
    
        $currentObj = New-Object System.Windows.Forms.Label
        $currentObj.Location = New-Object System.Drawing.Size(100, $height) 
        $currentObj.Size = New-Object System.Drawing.Size(300,20) 
        $currentObj.Text = $_
        $currentObj.Name = $_
        $objForm.Controls.Add($currentObj)
    
    
        ###Checkbox Programm 32 Bit
        $currentObj32  = new-object System.Windows.Forms.checkbox
        $currentObj32.Location = new-object System.Drawing.Size(20,($height -18))
        $currentObj32.Size = new-object System.Drawing.Size(40,50)
    
        $currentObj32.Checked = $false
        $objForm.Controls.Add($currentObj32) 
    
    
        ###Checkbox Programm 64 Bit
        $currentObj64 = new-object System.Windows.Forms.checkbox
        $currentObj64.Location = new-object System.Drawing.Size(60,($height -18))
        $currentObj64.Size = new-object System.Drawing.Size(40,50)
        $currentObj64.Checked = $false
        $objForm.Controls.Add($currentObj64)
    
        $height += 33
    
    }
    
    
    
        ### OK Button End
        $OKButton = New-Object System.Windows.Forms.Button
        $OKButton.Location = New-Object System.Drawing.Size(75,700)
        $OKButton.Size = New-Object System.Drawing.Size(75,23)
        $OKButton.Text = "OK"
        $OKButton.Name = "OK"
        $OKButton.DialogResult = "OK"
        $OKButton.Add_Click({$objForm.Close()})
        $objForm.Controls.Add($OKButton) 
    
    #....
    

    输出:

    【讨论】:

    • 感谢您的提示,但我需要两个复选框,例如,您可以为硬件较低的系统手动选择 32 位。
    • 我用您出色的动态方法发现了一个问题。在我的版本中,我使用“$obj7zip.Checked = $false/true”来更改 GUI 中的状态。现在使用动态方法我不再有这个选项了。我的想法是,我可以数出“ForEach-Object”并使用它给我的数字。但这对我来说似乎很复杂作为解决方案。你有什么想法我如何让统计数据返回到将复选框操作为真或假?
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多