Использование .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

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 полностью анализируется до того, как будет выполнен первый оператор в скрипте. Неразрешимый токен имени типа внутри определения 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 , и необходимая работа отслеживается как часть этой проблемы .

  • Регулярное выражение PowerShell разделяется на одно и два пробела
  • Как получить контрольную сумму MD5 в PowerShell
  • Потерянное подключение к хосту Hyper V после создания внешнего коммутатора
  • Массовое преобразование фотографий в меньший размер?
  • Лучший способ проверить, существует ли путь в PowerShell
  • Powershell with exchange-Как добавить весь подробный вывод в файл
  • Файлы и подпапки файлов PowerShell FTP
  • Как включить выполнение сценариев PowerShell?
  • Использование PowerShell для записи файла в UTF-8 без спецификации
  • Использование Invoke-Command -ScriptBlock для функции с аргументами
  • Многомерные массивы Powershell
  • Interesting Posts

    Рекомендации по защите REST API / веб-службы

    Windows 7 Virtual PC + Linux Ubuntu

    Что означает $ 1 в моем файле .htaccess?

    Возможно ли / хорошая практика использовать один и тот же закрытый ключ для двух серверов для входа без пароля с одного и того же рабочего места / локального сервера?

    Как извлечь все ZIP-файлы в подпапках с помощью 7-Zip в Windows 7

    Значок пиктограммы на значок панели задач (2) добавлен

    Передача списков из одной функции в другую в Swift

    Ошибка обнаружения PhotoPicker: Ошибка Домен = Код PlugInKit = 13

    Linux Hibernate после ожидания

    Как запустить команду запуска с правами root

    NoClassDefFoundError com.apache.hadoop.fs.FSDataInputStream при выполнении искровой оболочки

    Почему добавление жизни к признаку с помощью оператора плюс (Iterator + a) необходимо?

    Возможности разделения Notepad ++ на более чем 2 окна

    Удаление элементов из коллекции в java при итерации по ней

    Фоновая работа в bash отключается, когда окно запуска закрыто: как этого избежать?

    Давайте будем гением компьютера.