Использование .Net-объектов в classе Powershell (V5)
Это основное редактирование, сделанное для ясности. Кажется, мне нужно работать над формированием мыслей. Ниже приведен точный код, с которым я столкнулся. Краткое описание: Я пытаюсь настроить class powershell, который будет содержать объекты разных типов для легкого доступа. Я делал это много раз на C #, поэтому я подумал, что это будет довольно прямолинейно. Требуются типы [System.Printing] и WMI-Objects.
Первоначально я попытался написать class непосредственно в свой профиль Powershell для удобства использования, но мой профиль не загружается, когда мне приходится вводить в него код classа. Сказать, что он не может найти имя типа «System.Printing.PrintServer» или любые другие явно перечисленные типы. После этого я переместил его в свой собственный модуль, а затем установил мой профиль для импорта модуля на открытое. Однако даже при сохранении в своем собственном модуле, если я явно перечисляю .Net Type для любого из свойств, весь модуль не загружается. Независимо от того, я добавил или импортировал тип / dll. Конкретной проблемой является следующее: [string] $ Name [System.Printing.PrintServer] $ Server [System.Printing.PrintQueue] $ Queue [System.Printing.PrintTicket] $ Ticket [System.Management.ManagementObject] $ Unit [bool ] $ IsDefault
Когда я это установлю, все «вроде» работает, но тогда все мои свойства имеют тип _Object, что не помогает. [string] $ Name $ Server $ Queue $ Ticket $ Unit $ IsDefault
- Проверка молчаливого обновления Java
- Как я могу использовать PowerShell с командной строкой Visual Studio?
- Синхронизировать ZIP-файл PowerShell
- Как проверить почтовый ящик обмена через powershell?
- Запрос на ввод пользователя в PowerShell
Add-Type -AssemblyName System.Printing Add-Type -AssemblyName ReachFramework Class PrinterObject { [string]$Name [System.Printing.PrintServer]$Server [System.Printing.PrintQueue]$Queue [System.Printing.PrintTicket]$Ticket [System.Management.ManagementObject]$Unit [bool]$IsDefault PrinterObject([string]$Name) { #Add-Type -AssemblyName System.Printing #Add-Type -AssemblyName ReachFramework $this.Server = New-Object System.Printing.PrintServer -ArgumentList [System.Printing.PrintSystemDesiredAccess]::AdministrateServer $this.Queue = New-Object System.Printing.PrintQueue (($this.Server), ($this.Server.GetPrintQueues() | Where-Object {$_.Name -match $Name} | Select-Object -ExpandProperty Name)) $this.Ticket = $this.Queue.UserPrintTicket $this.Unit = Get-WmiObject -Query "SELECT * FROM Win32_Printer WHERE Name LIKE `"%$Name%`"" } PrinterObject([string]$Name, [bool]$IsNetwork) { #Add-Type -AssemblyName System.Printing #Add-Type -AssemblyName ReachFramework if($IsNetwork -eq $true) { $this.Server = New-Object System.Printing.PrintServer ("\\Server") $this.Queue = New-Object System.Printing.PrintQueue (($this.Server), ($this.Server.GetPrintQueues() | Where-Object {$_.Name -match $Name} | Select-Object -ExpandProperty Name)) $this.Ticket = $this.Queue.UserPrintTicket $this.Unit = Get-WmiObject -Query "SELECT * FROM Win32_Printer WHERE Name LIKE `"%$Name%`"" } else { $This.Server = New-Object System.Printing.PrintServer -argumentList [System.Printing.PrintSystemDesiredAccess]::AdministrateServer $this.Queue = New-Object System.Printing.PrintQueue (($this.Server), ($this.Server.GetPrintQueues() | Where-Object {$_.Name -match $Name} | Select-Object -ExpandProperty Name)) $this.Ticket = $this.Queue.UserPrintTicket $this.Unit = Get-WmiObject -Query "SELECT * FROM Win32_Printer WHERE Name LIKE `"%$Name%`"" } } [void]SetPrintTicket([int]$Copies, [string]$Collation, [string]$Duplex) { $this.Ticket.CopyCount = $Copies $this.Ticket.Collation = $Collation $this.Ticket.Duplexing = $Duplex $this.Queue.Commit() } [Object]GetJobs($Option) { if($Option -eq 1) { return $this.Queue.GetPrintJobInfoCollection() | Sort-Object -Property JobIdentifier | Select-Object -First 1} else { return $this.Queue.GetPrintJobInfoCollection() } } static [Object]ShowAllPrinters() { Return Get-WmiObject -Class Win32_Printer | Select-Object -Property Name, SystemName } }
- Могу ли я получить && для работы в Powershell?
- Как войти на сайт с базовой аутентификацией с помощью Powershell
- Как заставить вывод в «Format-Table» для пользовательского PSObject БЕЗ использования файла .format.ps1xml?
- Запланированное задание Windows 10 выполняется как пользователь admin не запускает powershell
- Как выполнить нажатие клавиши внутри powershell?
- Что я должен использовать: «Write-Host», «Write-Output» или « :: WriteLine»?
- Печать символов Unicode в приглашении PowerShell
- Как использовать Powershell Remote через Интернет?
Каждый скрипт PowerShell полностью анализируется до того, как будет выполнен первый оператор в скрипте. Неразрешимый токен имени типа внутри определения classа считается ошибкой синтаксического анализа. Чтобы решить вашу проблему, вам необходимо загрузить свои типы до того, как будет проанализировано определение classа, поэтому определение classа должно быть в отдельном файле. Например:
Main.ps1:
Add-Type -AssemblyName System.Printing Add-Type -AssemblyName ReachFramework . $PSScriptRoot\Class.ps1
Class.ps1:
using namespace System.Management using namespace System.Printing Class PrinterObject { [string]$Name [PrintServer]$Server [PrintQueue]$Queue [PrintTicket]$Ticket [ManagementObject]$Unit [bool]$IsDefault }
заusing namespace System.Management using namespace System.Printing Class PrinterObject { [string]$Name [PrintServer]$Server [PrintQueue]$Queue [PrintTicket]$Ticket [ManagementObject]$Unit [bool]$IsDefault }
Другая возможность – вставить Class.ps1
в виде строки и использовать Invoke-Expression
для ее выполнения. Это задержит parsing определения classа до времени, когда типы доступны.
Add-Type -AssemblyName System.Printing Add-Type -AssemblyName ReachFramework Invoke-Expression @' using namespace System.Management using namespace System.Printing Class PrinterObject { [string]$Name [PrintServer]$Server [PrintQueue]$Queue [PrintTicket]$Ticket [ManagementObject]$Unit [bool]$IsDefault } '@
заAdd-Type -AssemblyName System.Printing Add-Type -AssemblyName ReachFramework Invoke-Expression @' using namespace System.Management using namespace System.Printing Class PrinterObject { [string]$Name [PrintServer]$Server [PrintQueue]$Queue [PrintTicket]$Ticket [ManagementObject]$Unit [bool]$IsDefault } '@
В дополнение к полезному ответу PetSerAl :
using assembly
должно быть правильным решением, но его использование во время parsingа еще не реализовано с Windows PowerShell v5.1 / PowerShell Core v6.1, поскольку для этого требуется дополнительная работа, чтобы избежать возможного нежелательного выполнения произвольного кода, когда загружается assembly.
Реализация этого вопроса была освещена зеленым цветом в этой проблеме GitHub , и необходимая работа отслеживается как часть этой проблемы .