Использование внешнего кода в классах PowerShell [duplicate]

Лучше использовать конструкцию «while: else:» в Python, если цикл «while» не выполняется, тогда выполняется оператор «else». То, как он работает сегодня, не имеет смысла, потому что вы можете использовать код ниже с теми же результатами ...

n = 5
while n != 0:
    print n
    n -= 1
print "what the..."
5
задан Dakota Lorance 6 January 2016 в 16:24
поделиться

2 ответа

Каждый скрипт PowerShell полностью разбирается до того, как будет выполнен первый оператор в скрипте. Неразрешимый токен имени типа внутри определения класса считается ошибкой синтаксического анализа. Чтобы решить вашу проблему, вам необходимо загрузить свои типы до того, как будет проанализировано определение класса, поэтому определение класса должно быть в отдельном файле. Например:

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
}

Другая возможность была бы вставлять Class.ps1 в виде строки и используйте Invoke-Expression для его выполнения. Это задержит парсинг определения класса до времени, в котором доступны типы.

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
    }
’@
10
ответ дан PetSerAl 19 August 2018 в 08:31
поделиться
  • 1
    Так. , , Я пробовал это, и я предполагаю, что очень странная ошибка только что вызвала бесконечное количество окон powershell, которые появляются так быстро, что в моей системе закончилась память. , , – Dakota Lorance 6 January 2016 в 17:41
  • 2
    Вы разделили файл, в котором находится точка-источник? Как положить ". $ PSScriptRoot \ Class.ps1 & Quot; в файле с именем «Class.ps1», ? – Martin Maat 6 January 2016 в 21:08
  • 3
    Так ли это поведение ошибка, или система импорта PowerShell это ужасно? – tyteen4a03 3 November 2017 в 16:51
  • 4
    @ tyteen4a03 using assembly не вызывают сборку времени синтаксического анализа. Загрузка сборки может привести к выполнению произвольного кода, что может быть нежелательным. И извлечение типов из сборных метаданных без его загрузки еще не реализовано, AFAIK. – PetSerAl 3 November 2017 в 16:55
  • 5
    @TNT Как eval над постоянной строкой более опасно, а затем выполнение произвольного файла сценария? – PetSerAl 3 June 2018 в 16:16

В дополнение Полезный ответ PetSerAl :

using assembly должен быть правильным решением, но его использование при время разбора еще не реализовано с Windows PowerShell v5.1 / PowerShell Core v6.1, поскольку для него требуется дополнительная работа , чтобы избежать возможности для нежелательного выполнения произвольных код, когда сборка загружена.

Реализация этой функции была освещена зеленым цветом в этой проблеме GitHub , и необходимая работа отслеживается как часть этой проблемы .

0
ответ дан mklement0 19 August 2018 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: