Лучше использовать конструкцию «while: else:» в Python, если цикл «while» не выполняется, тогда выполняется оператор «else». То, как он работает сегодня, не имеет смысла, потому что вы можете использовать код ниже с теми же результатами ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
Каждый скрипт 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
}
’@
В дополнение Полезный ответ PetSerAl :
using assembly
должен быть правильным решением, но его использование при время разбора еще не реализовано с Windows PowerShell v5.1 / PowerShell Core v6.1, поскольку для него требуется дополнительная работа , чтобы избежать возможности для нежелательного выполнения произвольных код, когда сборка загружена.
Реализация этой функции была освещена зеленым цветом в этой проблеме GitHub , и необходимая работа отслеживается как часть этой проблемы .
using assembly
не вызывают сборку времени синтаксического анализа. Загрузка сборки может привести к выполнению произвольного кода, что может быть нежелательным. И извлечение типов из сборных метаданных без его загрузки еще не реализовано, AFAIK. – PetSerAl 3 November 2017 в 16:55eval
над постоянной строкой более опасно, а затем выполнение произвольного файла сценария? – PetSerAl 3 June 2018 в 16:16