2014-04-13 35 views
2

是否有可能从一个字符串获取System.Type然后将其应用于一个变量?如何动态设置PowerShell变量的类型?

以下是我试图转换,使其更安全(即不涉及调用一个字符串)功能:

Function ParseLine($Type, $VariableName, $Value){ 
    Invoke-Expression "[$Type] `$$VariableName = $Value" 
} 

我看着New-VariableSet-Variable,但没有类型设置有关参数在定义中。

我期望的东西,看起来像下面,但我找不到参数Type或等价的:

Function ParseLine($Type, $VariableName, $Value){ 
    New-Variable -Name $VariableName -Value $Value -Type ([type] $Type) 
} 

语境:我尝试创建一个简单的分析器定义看起来像:

$ResponseLogFormat = New-InputFormat { 
    ParseLine -Type int -VariableName RecordLength 
    RepeatedSection -RepeatCount $RecordLength { 
     ParseLine string +ComputerName 
     ParseLine double +AverageResponse 
    } 
} 

$ResponseLogFormat.Parse($FilePath) 
+0

而不是试图设置变量类型,也许你应该考虑确保数据是你想要的类型?例如,你可以确保你的ParseLine函数接受一个转换函数而不是一个字符串,所以对于double来说,它将是'ParseLine [Convert] :: ToDouble + ComputerName'。这将允许你的函数支持解析自定义类型,通过传递一个返回新属性值的scriptblock。如果你愿意,你也可以支持一些默认转换器,它可以根据名字查找。让我知道你是否希望我用样本写一个答案。 –

+0

你的意思是'ParseLine {[Convert] :: ToDouble} + ComputerName'?至于现在,我使用'ParseLine($ Type,$ VariableName,$ ParseScript)'将函数定义映射到*,以便我可以为自定义对象执行以下操作:'ParseLine * Response {New-CustomObject $ CurrentLine}'。但是看到转换器的方法会很有趣:) – tkokasih

+0

如果你给我一些解析样本行(以及样本行的预期输出),我会写出一个解析这些行的样本。请编辑问题以添加附加信息。 –

回答

6

可以使用-as操作投下变量为特定类型:

Function ParseLine($Type, $VariableName, $Value){ 
    Set-Variable $VariableName -Scope 1 -Value ($Value -as ($Type -as [type])) 
} 

这将使用-as$Type字符串创建一个类型,然后使用它来投射$Value

我不确定你的意图与变量,但如果你想在功能完成后坚持它,你需要将它设置在父范围。

+0

感谢您的回答!基于你的回答,我使用下面这行:'Set-Variable $ VariableName -Scope script -Value($ Value -as([type] $ Type))''。 – tkokasih