1 回答

TA貢獻1801條經驗 獲得超16個贊
從索引+連接字符串的數組中調用系統對象
如果您將.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 關注
- 141 瀏覽
添加回答
舉報