【问题标题】:How do I dynamically set the type of PowerShell variables?如何动态设置 PowerShell 变量的类型?
【发布时间】:2014-04-13 11:54:22
【问题描述】:

是否可以从字符串中获取 System.Type,然后将其应用于变量?

以下是我尝试转换以使其更安全的函数(即不涉及调用字符串):

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 )

【问题讨论】:

  • 与其尝试设置变量类型,或许您应该考虑确保数据是您想要的类型?例如,您可以确保您的 ParseLine 函数采用转换器函数而不是字符串,因此对于 double,它将是 ParseLine [Convert]::ToDouble +ComputerName。这将允许您的函数也支持解析自定义类型,方法是传入一个返回新属性值的脚本块。您也可以支持一些默认转换器,如果您愿意,它可以根据名称进行查找。如果您希望我用示例写答案,请告诉我。
  • 你的意思是ParseLine {[Convert]::ToDouble} +ComputerName?就目前而言,我正在使用像ParseLine($Type,$VariableName,$ParseScript) 这样的函数定义,其中'anytype' 映射到*,这样我就可以对自定义对象执行以下操作:ParseLine * Response {New-CustomObject $CurrentLine}。但是看到转换器方法会很有趣:)
  • 如果您给我一些示例行来解析(以及示例行的预期输出),我将编写一个解析这些行的示例。请编辑问题以添加其他信息。

标签: powershell


【解决方案1】:

您可以使用-as 运算符将变量转换为特定类型:

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

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

我不确定你对变量的意图,但如果你想在函数完成后持久化它,你需要在父作用域中设置它。

【讨论】:

  • 感谢您的回答!根据您的回答,我使用以下行:Set-Variable $VariableName -Scope script -Value ($Value -as ([type] $Type)).
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 2011-10-28
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2016-03-24
  • 2021-12-29
相关资源
最近更新 更多