2016-11-04 4 views
0

Я пишу сценарий Powershell для автоматизации установки принтеров в нашей сети. Тем не менее, я переусердствовал, но я не могу заставить свою командную кнопку разрешить пользователю выбирать принтер из списка и устанавливать его по умолчанию.Как запрограммировать командную кнопку для использования строки в powershell

У меня есть строчная настройка для определения принтеров (4 из них), но независимо от того, каким образом я кодирую $ OKButton.Add_Click, он не будет с выбором пользователей.

Вот код, который у меня есть. Может кто-нибудь, пожалуйста, скажите мне, что я пропущу?

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Select a Printer" 
$objForm.Size = New-Object System.Drawing.Size(400,200) 
$objForm.StartPosition = "CenterScreen" 

$objForm.KeyPreview = $True 
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$x=$objListBox.SelectedItem;$objForm.Close()}}) 
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}}) 

#Ok Button 
$OKButton = New-Object System.Windows.Forms.Button 
$OKButton.Location = New-Object System.Drawing.Size(75,120) 
$OKButton.Size = New-Object System.Drawing.Size(75,23) 
$OKButton.Text = "OK" 
$OKButton.Add_Click({$x=$objListBox.SelectedItem;$strPrinter,$objForm.Close()}) 
$objForm.Controls.Add($OKButton) 

#Cancel Button 
$CancelButton = New-Object System.Windows.Forms.Button 
$CancelButton.Location = New-Object System.Drawing.Size(150,120) 
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
$CancelButton.Text = "Cancel" 
$CancelButton.Add_Click({$objForm.Close()}) 
$objForm.Controls.Add($CancelButton) 

$objLabel = New-Object System.Windows.Forms.Label 
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Please select a printer:" 
$objForm.Controls.Add($objLabel) 

#List box showing printer options 
$objListBox = New-Object System.Windows.Forms.ListBox 
$objListBox.Location = New-Object System.Drawing.Size(10,40) 
$objListBox.Size = New-Object System.Drawing.Size(360,20) 
$objListBox.Height = 80 

[void] $objListBox.Items.Add("HP Color LaserJet CP2020") 
[void] $objListBox.Items.Add("Brother DCP-8065DN") 
[void] $objListBox.Items.Add("Canon iR-ADV C2220/2230") 
[void] $objListBox.Items.Add("HP LJ300-400 color M351-M451") 

$objForm.Controls.Add($objListBox) 

$objForm.Topmost = $True 

$objForm.Add_Shown({$objForm.Activate()}) 
[void] $objForm.ShowDialog() 

#String to call printers, each printer is assigned a value (1,2,3,4) 
$strPrinter = 1, "HP Color LaserJet CP2020", ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\\PS\PT01')) 
$strPrinter = 2, "Brother DCP-8065DN", ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\\PS\PT02')) 
$strPrinter = 3, "Canon iR-ADV C2220/2230", ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\\PS\PT03')) 
$strPrinter = 4, "HP LJ300-400 color M351-M451", ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\PS\PT04')) 

$x 
+0

Это (прежде всего) проблема с областью определения, замените '$ x = $ objListBox.SelectedItem' на' $ global : x = $ objListBox.SelectedItem' –

ответ

0

Есть две проблемы с вашим текущим сценарием.

Первый, что $x выглядит пустым, связано с проблемой. Когда внутри области действия обработчика события add_Click()$x является локальной переменной, и ее значение не будет доступно вне обработчика события.

Вы мог работы вокруг этого, указав родительскую сферу, как (обратите внимание на global: области видимости спецификатор):

$global:x = $objListBox.SelectedItem 

Но до сих пор ничего не случилось бы, что привел меня ко второму вопросу:

Я не уверен, что вы подразумеваете под «строковой установкой», но ваш скрипт в основном заканчивает установку последнего принтера по умолчанию, когда он запускается.

Вы хотите, чтобы определить принтеры фронт, перед показом диалога, и обернуть ((New-Object... заявления в виде ScriptBlock, что-то вроде:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

# New array of "printer objects", rather than $strPrinter 
$Printers = @(
    New-Object psobject -Property @{ 
     Name = "HP Color LaserJet CP2020" 
     SetCommand = { ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\\PS\PT01')) } 
    }, 
    New-Object psobject -Property @{ 
     Name = "Brother DCP-8065DN" 
     SetCommand = { ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\\PS\PT02')) } 
    }, 
    New-Object psobject -Property @{ 
     Name = "Canon iR-ADV C2220/2230" 
     SetCommand = { ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\\PS\PT03')) } 
    }, 
    New-Object psobject -Property @{ 
     Name = "HP LJ300-400 color M351-M451" 
     SetCommand = { ((New-Object -ComObject WScript.Network).SetDefaultPrinter('\PS\PT04')) } 
    } 
) 

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Select a Printer" 
$objForm.Size = New-Object System.Drawing.Size(400,200) 
$objForm.StartPosition = "CenterScreen" 

$objForm.KeyPreview = $True 
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$x=$objListBox.SelectedItem;$objForm.Close()}}) 
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}}) 

#Ok Button 
$OKButton = New-Object System.Windows.Forms.Button 
$OKButton.Location = New-Object System.Drawing.Size(75,120) 
$OKButton.Size = New-Object System.Drawing.Size(75,23) 
$OKButton.Text = "OK" 
$OKButton.Add_Click({ 
    # Grab the printer array index 
    $index = $objListBox.SelectedIndex 

    # Execute the appropriate command 
    & $Printers[$index].SetCommand 

    # Exit 
    $objForm.Close() 
}) 
$objForm.Controls.Add($OKButton) 

#Cancel Button 
$CancelButton = New-Object System.Windows.Forms.Button 
$CancelButton.Location = New-Object System.Drawing.Size(150,120) 
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
$CancelButton.Text = "Cancel" 
$CancelButton.Add_Click({$objForm.Close()}) 
$objForm.Controls.Add($CancelButton) 

$objLabel = New-Object System.Windows.Forms.Label 
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Please select a printer:" 
$objForm.Controls.Add($objLabel) 

#List box showing printer options 
$objListBox = New-Object System.Windows.Forms.ListBox 
$objListBox.Location = New-Object System.Drawing.Size(10,40) 
$objListBox.Size = New-Object System.Drawing.Size(360,20) 
$objListBox.Height = 80 

foreach($Printer in $Printers){ 
    [void] $objListBox.Items.Add($Printer.Name) 
} 

$objForm.Controls.Add($objListBox) 

$objForm.Topmost = $True 

$objForm.Add_Shown({$objForm.Activate()}) 
[void] $objForm.ShowDialog() 

Поскольку принтеры будут добавлены к ListBox в правильной order, мы можем просто использовать свойство SelectedIndex, чтобы найти исходный объект принтера и вызвать скриптовый блок, который устанавливает его как значение по умолчанию.

+0

Итак, когда я тестировал обновленный код. Я получил окно списка на экране, это было пусто, после чего я получил ошибку ниже New-Object: Невозможно преобразовать 'System.Object []' в тип 'System.Collections.IDictionary', требуемый параметром 'Property'. Указанный метод не поддерживается. В C: \ Users \ Documents \ PowerShell_Scripts \ Production_Scripts \ Install Принтеры на PS3_V2.ps1: 6 char: 35 + New-Object psobject -Property { + ~ + Категория: InvalidArgument: (:) [New-Object] , ParameterBindingException + FullyQualifiedErrorId: –

+0

не '-Property {...' but '-Property @ {...' (обратите внимание на '@') –

+0

Хорошо, у меня есть: Новый объект psobject -Property @ {at Строка 6, сообщала ли она об ошибке. $ Принтер = @ ( New-Object PSObject -Property @ { Name = "HP Color LaserJet CP2020" SetCommand = {((New-Object -ComObject WScript.Network) .SetDefaultPrinter ('\\ PS \ PS3 '))} }, –

Смежные вопросы