如何将参数类型声明为必须显式加载的.NET框架类型?

时间:2015-09-08 17:26:04

标签: powershell parameters .net-assembly

我希望能够将Color类型从System.Drawing传递到我的PowerShell脚本中。但是,除非我在运行脚本之前显式加载System.Drawing.dll,否则我不想让人们这样做。

除非我在脚本之外加载dll,否则会出现此错误:

  

无法找到类型[System.Drawing.Color]

我的PowerShell Param声明如下:

Param(
    [Parameter(Mandatory = $true)][string] $TargetFile,
    [Parameter()][int] $Thickness = 1,
    [Parameter()][Switch] $UseTopLeftColor = $false,
    [Parameter()][System.Drawing.Color] $BorderColor = [System.Drawing.Color]::FromArgb(195,195,195)
)

加载DLL引用的代码是:

[Void][System.Reflection.Assembly]::LoadFile("C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll")

如何为脚本定义DLL的依赖关系并让它自动引用DLL?

1 个答案:

答案 0 :(得分:1)

Add-Type只是编写[Reflection.Assembly]::LoadFile()的一种更方便的方式。在脚本中Param()之前都不能使用它们。

如果您希望能够从任何地方运行PowerShell脚本,我建议为每种基本颜色指定一个参数,然后计算脚本中的颜色。这样你也可以验证每个值:

Param(
  [Parameter(Position=0)]
  [ValidateRange(0,255)]
  [int]$BorderRed = 195,
  [Parameter(Position=1)]
  [ValidateRange(0,255)]
  [int]$BorderGreen = 195,
  [Parameter(Position=2)]
  [ValidateRange(0,255)]
  [int]$BorderBlue = 195
)

Add-Type -Assembly 'System.Drawing'

[Drawing.Color]::FromArgb($BorderRed, $BorderGreen, $BorderBlue)

尝试将颜色指定为单个参数的3个值的列表将难以实现。从PowerShell外部,您无法将数组传递给参数,因此您必须指定类似逗号分隔字符串的内容并将其解析为3个整数值。

将颜色名称作为单个参数传递可行:

Param(
  [Parameter()]
  [string]$BorderColor = 'Blue'
)

Add-Type -Assembly 'System.Drawing'

[Drawing.Color]::$BorderColor