1 回答
TA贡献1801条经验 获得超15个赞
从索引+连接字符串的数组中调用系统对象
如果您将.NET 类型名称存储在字符串中,
转换为
[type]
将它们转换为类型对象;在 PSv5+ 中,您可以在此类类型对象上调用静态::new()
方法以创建该类型的实例。$typeName = 'System.DateTime'; $type = [type] $typeName; $instance = $type::new(0)
或者(PSv4-),将类型名称字符串传递给以
New-Object
创建一个实例。$typeName = 'System.DateTime'; New-Object $typeName -Args 0
注意:在这两种情况下,您都需要知道要传递的适当构造函数参数(如果有)。
从字符串数组调用程序集或程序集类型
您的示例表明您希望将名称空间导入代码中,这样您就可以更方便地仅通过名称(例如,[Encoding]
)来引用类型,而不必使用类型的全名(例如,[System.Text.Encoding]
),C# 将其实现为using <namespace>
.
PowerShell 的等效功能是using namespace <type-name>
,但它仅适用于文字类型名称(如在 C# 中)。
此外,与类型字面量(如 )不同[Text.Encoding]
,省略System
组件不是可选的,因此using namespace System.Text
有效,但using namespace Text
没有(它被悄悄接受,但无效)。
Invoke-Expression
您可以通过使用(否则应避免使用)来解决此问题:
$namespace = 'System.Collections'
Invoke-Expression "using namespace $namespace"
# Now you can access the types in namespace System.Collections by
# their mere name.
[ArrayList] # short for: [System.Collections.ArrayList]
冗余相似函数调用的示例......减少冗余的想法
看起来您正在尝试动态定义函数。
由于 PowerShell 函数公开为名为 的PowerShell驱动器Function:,因此您可以使用Set-Content动态定义函数:
$f = "Console" , "Warning" , "Success" , "Error"
$m = "White" , "Yellow" , "Green" , "Red"
0..($f.Count-1) | ForEach-Object {
if ( $_ -eq 0 ) {
Function Log { param($MSG) $MSG | Out-File $LogFile -Append -Force }
}
else {
$funcName = $f[$_]
Set-Content Function:$funcName @"
param(`$MSG)
Write-Host `$MSG -ForegroundColor $($m[$_])
Log `$MSG
"@
}
}
这将定义函数Log和包装函数Warning,Success和Error,它们在带有彩色控制台输出的调用之前Log。
请注意使用可扩展的here-string ( @"<newline>...<newline>"@) 将函数体定义为多行字符串(为了便于阅读),以及如何嵌入$字符。不应预先展开的必须转义为`$.
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报