none
Добавить GUI [PoSH] RRS feed

  • Вопрос

  • Здравствуйте!
    Наваял такое дело. Оно лезет на принт-сервер, читает там по условиям живые принтеры и выдает список найденых с предложением поставить любой из них

    $Error.Clear()
    $PrintServerShare = '\\srv-print01\'
    $PrintServer = $PrintServerShare -replace '\\'
    $PrinterList = Get-Printer -ComputerName $PrintServer | 
    Where-Object {$_.DeviceType -like 'Print' -and $_.PrinterStatus -like 'normal'} for ($i=0; $i -le $PrinterList.Count-1;$i++) { Write-Host $i '-' ($PrinterList.Location)[$i] } switch ($j = Read-host 'Выберите принтер') { $j { $PrinterName = $PrintServerShare+($PrinterList[$j]).Name $NetPrinter = (New-Object -ComObject WScript.Network) $NetPrinter.AddWindowsPrinterConnection("$PrinterName") $NetPrinter.SetDefaultPrinter("$PrinterName") } } if (!$Error) { cls Write-Host (($PrinterList[$j]).Name).ToUpper() "успешно установлен по УМОЛЧАНИЮ." -ForegroundColor Green }

    Это как-то может обрасти ГУЯми? Ведь тут нет фиксированного количества принтеров =/ Грубо говоря, скрипт может вытащить разно кол-во оных, поэтому и кнопок будет хз сколько каждый раз. Решаемо такое дело?

    Условно говоря, на кнопку с соотв. принтером нажимаешь и он ставится, выводит ок, гратц и все такое...

    Спасибо!


    • Изменено NTLose 6 января 2016 г. 15:56
    6 января 2016 г. 15:55

Ответы

  • Использовать Out-Gridview:

    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    $PrintServerShare = '\\srv-print01\'
    $PrintServer = $PrintServerShare -replace '\\'
    $PrinterList = Get-Printer -ComputerName $PrintServer | 
    	Where-Object {$_.DeviceType -like 'Print' -and $_.PrinterStatus -like 'normal'}
    	
    $Name = ($PrinterList | Out-GridView -PassThru).Name
    if($Name)
    {
    	$PrinterName  = $PrintServerShare + $Name
    	$NetPrinter = New-Object -ComObject WScript.Network
    	try {
    		$NetPrinter.AddWindowsPrinterConnection($PrinterName)
    		$NetPrinter.SetDefaultPrinter($PrinterName)
    		[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName прошла успешно!","Успех","OK")
    	}
    	catch {
    		[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName - $_","Ошибка","OK","Stop")
    	}
    }




    • Изменено KazunEditor 6 января 2016 г. 16:36
    • Предложено в качестве ответа Alexander RusinovModerator 6 января 2016 г. 17:00
    • Помечено в качестве ответа NTLose 6 января 2016 г. 18:29
    6 января 2016 г. 16:21
    Отвечающий
  • [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    $PrintServerShare = '\\srv-print01\'
    $PrintServer = $PrintServerShare -replace '\\'
    $PrinterList = Get-Printer -ComputerName $PrintServer | 
    	Where-Object {$_.DeviceType -like 'Print' -and $_.PrinterStatus -like 'normal'}
    	
    $form = New-Object System.Windows.Forms.Form
    $button1 = New-Object System.Windows.Forms.Button 
    $button2 = New-Object System.Windows.Forms.Button
    $form.Size = New-Object System.Drawing.Size(900,600)
    
    $PrinterList = $PrinterList | select Name,Location
    $list = New-Object System.collections.ArrayList
    $list.AddRange($PrinterList)
    
    $dataGridView = New-Object System.Windows.Forms.DataGridView -Property @{
        Size=New-Object System.Drawing.Size(600,300)
        ColumnHeadersVisible = $true
        DataSource = $list
    }
    
    $button1_OnClick=  
    { 
        $Form.Close() 
    } 
     
    $button2_OnClick=  
    { 
        $selectedRow = $dataGridView.CurrentRow.Index
        if (($Name=$Script:PrinterList[$selectedRow].Location)) { 
                $PrinterName  = $PrintServerShare + $Name
    			$NetPrinter = New-Object -ComObject WScript.Network
    			try {
    				$NetPrinter.AddWindowsPrinterConnection($PrinterName)
    				$NetPrinter.SetDefaultPrinter($PrinterName)
    				[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName прошла успешно!","Успех","OK")
    			}
    			catch {
    				[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName - $_","Ошибка","OK","Stop")
    			}
            } 
    } 
    
    $button1.Size = New-Object System.Drawing.Size(75,23) 
    $button1.Text = "Close"
    $button1.Location = New-Object System.Drawing.Point(230,378)
    $button1.Add_Click($button1_OnClick)
    
    $button2.Size = New-Object System.Drawing.Size(75,23)
    $button2.Location = New-Object System.Drawing.Point(130,378)
    $button2.Text = "Set"
    $button2.Add_Click($button2_OnClick)
    
    $form.Controls.Add($dataGridView)
    $form.Controls.Add($button1)
    $form.Controls.Add($button2)
    $form.Add_Load({
    $dataGridView.Columns[0].AutoSizeMode = "AllCells"
    $dataGridView.Columns[1].AutoSizeMode = "AllCells"
    })
    $form.ShowDialog()

    • Помечено в качестве ответа NTLose 6 января 2016 г. 18:29
    6 января 2016 г. 18:19
    Отвечающий

Все ответы

  • Использовать Out-Gridview:

    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    $PrintServerShare = '\\srv-print01\'
    $PrintServer = $PrintServerShare -replace '\\'
    $PrinterList = Get-Printer -ComputerName $PrintServer | 
    	Where-Object {$_.DeviceType -like 'Print' -and $_.PrinterStatus -like 'normal'}
    	
    $Name = ($PrinterList | Out-GridView -PassThru).Name
    if($Name)
    {
    	$PrinterName  = $PrintServerShare + $Name
    	$NetPrinter = New-Object -ComObject WScript.Network
    	try {
    		$NetPrinter.AddWindowsPrinterConnection($PrinterName)
    		$NetPrinter.SetDefaultPrinter($PrinterName)
    		[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName прошла успешно!","Успех","OK")
    	}
    	catch {
    		[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName - $_","Ошибка","OK","Stop")
    	}
    }




    • Изменено KazunEditor 6 января 2016 г. 16:36
    • Предложено в качестве ответа Alexander RusinovModerator 6 января 2016 г. 17:00
    • Помечено в качестве ответа NTLose 6 января 2016 г. 18:29
    6 января 2016 г. 16:21
    Отвечающий
  • Большое спасибо!

    Пришлось допиливать всерно) $_.name у нас не френдли совсем, нужно было перебить отображение в $_.location

    Грид можно изначально по размерам задать или это as is?

    А так все замечательно!


    • Изменено NTLose 6 января 2016 г. 16:52
    6 января 2016 г. 16:49
  • C out-griedview - никак не изменить размер, если только создать свою форму.
    6 января 2016 г. 17:28
    Отвечающий
  • Это сильно муторно? Не стоит того?
    6 января 2016 г. 17:32
  • [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    $PrintServerShare = '\\srv-print01\'
    $PrintServer = $PrintServerShare -replace '\\'
    $PrinterList = Get-Printer -ComputerName $PrintServer | 
    	Where-Object {$_.DeviceType -like 'Print' -and $_.PrinterStatus -like 'normal'}
    	
    $form = New-Object System.Windows.Forms.Form
    $button1 = New-Object System.Windows.Forms.Button 
    $button2 = New-Object System.Windows.Forms.Button
    $form.Size = New-Object System.Drawing.Size(900,600)
    
    $PrinterList = $PrinterList | select Name,Location
    $list = New-Object System.collections.ArrayList
    $list.AddRange($PrinterList)
    
    $dataGridView = New-Object System.Windows.Forms.DataGridView -Property @{
        Size=New-Object System.Drawing.Size(600,300)
        ColumnHeadersVisible = $true
        DataSource = $list
    }
    
    $button1_OnClick=  
    { 
        $Form.Close() 
    } 
     
    $button2_OnClick=  
    { 
        $selectedRow = $dataGridView.CurrentRow.Index
        if (($Name=$Script:PrinterList[$selectedRow].Location)) { 
                $PrinterName  = $PrintServerShare + $Name
    			$NetPrinter = New-Object -ComObject WScript.Network
    			try {
    				$NetPrinter.AddWindowsPrinterConnection($PrinterName)
    				$NetPrinter.SetDefaultPrinter($PrinterName)
    				[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName прошла успешно!","Успех","OK")
    			}
    			catch {
    				[Windows.Forms.MessageBox]::Show("Установка принтера $PrinterName - $_","Ошибка","OK","Stop")
    			}
            } 
    } 
    
    $button1.Size = New-Object System.Drawing.Size(75,23) 
    $button1.Text = "Close"
    $button1.Location = New-Object System.Drawing.Point(230,378)
    $button1.Add_Click($button1_OnClick)
    
    $button2.Size = New-Object System.Drawing.Size(75,23)
    $button2.Location = New-Object System.Drawing.Point(130,378)
    $button2.Text = "Set"
    $button2.Add_Click($button2_OnClick)
    
    $form.Controls.Add($dataGridView)
    $form.Controls.Add($button1)
    $form.Controls.Add($button2)
    $form.Add_Load({
    $dataGridView.Columns[0].AutoSizeMode = "AllCells"
    $dataGridView.Columns[1].AutoSizeMode = "AllCells"
    })
    $form.ShowDialog()

    • Помечено в качестве ответа NTLose 6 января 2016 г. 18:29
    6 января 2016 г. 18:19
    Отвечающий
  • Однако!

    Век живи..! =)

    Спасибо гигантское!

    6 января 2016 г. 18:29
  • А что это за конструкция такая?

    $Script:PrinterList[$selectedRow]

    Кстати не раз вижу но насмерть не понимаю что это значит... Так же как и

    $Using:blabla

    Буду раз если поясните. Спасибо!

    6 января 2016 г. 19:00
  • Про области видимости переменных в справке подробно описано - https://technet.microsoft.com/en-us/library/hh847849.aspx?f=255&MSPPError=-2147217396
    6 января 2016 г. 20:00
    Отвечающий