【发布时间】:2022-01-26 18:59:33
【问题描述】:
以下是我遇到问题的确切代码。
简要说明:
我正在尝试设置一个 PowerShell 类,该类将保存不同类型的对象以便于访问。我已经在 C# 中做过很多次了,所以我认为它会相当简单。需要的类型是 [System.Printing] 和 WMI-Objects。
最初我试图将类直接写入我的 PowerShell 配置文件以便于使用,但是当我必须在其中对代码进行分类时,我的配置文件无法加载。说它找不到类型名称“System.Printing.PrintServer”或任何其他明确列出的类型。
失败后,我将其移至其自己的特定模块,然后将我的配置文件设置为在打开时导入该模块。但是,即使存储在自己的模块中,如果我明确列出任何属性的 .NET 类型,整个模块也无法加载。不管我是否添加或导入了类型/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
}
}
【问题讨论】:
-
你能用“指定的类型”具体/字面意思吗?您提供的伪代码没有任何意义。您可能没有正确分离命名空间、类和值部分。没有人能从 [System.Object.SomeDotNetObject]::Enum 中看出这一点。
-
问题类型属于哪里?是在标准.NET 程序集中,在GAC 中自定义程序集,通过路径加载的自定义程序集还是在动态程序集
Add-Type -TypeDefinition ...? -
@PetSerAl 没关系——如果命名空间/类型可以在类定义之外解析,为什么不应该在类内部也适用?对我来说听起来像是一个错误。
-
@MathiasR.Jessen 我无法在我的电脑上重现这种行为,所以我要求提供更多详细信息以检查我是否遗漏了什么。
-
@MartinMaat 我已经更新了我正在使用的类的确切代码。我觉得这可能是类型未正确加载到 powershell 中的问题,因为如果我手动加载类型然后手动将此类键入到 shell 中,它工作得非常好
标签: .net powershell