1 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
從索引+連接字符串的數(shù)組中調(diào)用系統(tǒng)對象
如果您將.NET 類型名稱存儲在字符串中,
轉(zhuǎn)換為
[type]
將它們轉(zhuǎn)換為類型對象;在 PSv5+ 中,您可以在此類類型對象上調(diào)用靜態(tài)::new()
方法以創(chuàng)建該類型的實(shí)例。$typeName = 'System.DateTime'; $type = [type] $typeName; $instance = $type::new(0)
或者(PSv4-),將類型名稱字符串傳遞給以
New-Object
創(chuàng)建一個(gè)實(shí)例。$typeName = 'System.DateTime'; New-Object $typeName -Args 0
注意:在這兩種情況下,您都需要知道要傳遞的適當(dāng)構(gòu)造函數(shù)參數(shù)(如果有)。
從字符串?dāng)?shù)組調(diào)用程序集或程序集類型
您的示例表明您希望將名稱空間導(dǎo)入代碼中,這樣您就可以更方便地僅通過名稱(例如,[Encoding]
)來引用類型,而不必使用類型的全名(例如,[System.Text.Encoding]
),C# 將其實(shí)現(xiàn)為using <namespace>
.
PowerShell 的等效功能是using namespace <type-name>
,但它僅適用于文字類型名稱(如在 C# 中)。
此外,與類型字面量(如 )不同[Text.Encoding]
,省略System
組件不是可選的,因此using namespace System.Text
有效,但using namespace Text
沒有(它被悄悄接受,但無效)。
Invoke-Expression
您可以通過使用(否則應(yīng)避免使用)來解決此問題:
$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]
冗余相似函數(shù)調(diào)用的示例......減少冗余的想法
看起來您正在嘗試動態(tài)定義函數(shù)。
由于 PowerShell 函數(shù)公開為名為 的PowerShell驅(qū)動器Function:,因此您可以使用Set-Content動態(tài)定義函數(shù):
$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
"@
? ? }
}
這將定義函數(shù)Log和包裝函數(shù)Warning,Success和Error,它們在帶有彩色控制臺輸出的調(diào)用之前Log。
請注意使用可擴(kuò)展的here-string ( @"<newline>...<newline>"@) 將函數(shù)體定義為多行字符串(為了便于閱讀),以及如何嵌入$字符。不應(yīng)預(yù)先展開的必須轉(zhuǎn)義為`$.
- 1 回答
- 0 關(guān)注
- 137 瀏覽
添加回答
舉報(bào)