首页 > 解决方案 > 如何在 PowerShell 中将字符串值转换为动态数据类型?

问题描述

如果事先不知道数据类型,是否可以将字符串值分配给不同类型的变量?例如,在下面的示例中,如何在$values不更改其数据类型的情况下更新哈希值:

$values = @{
    "Boolean" = $true
    "Int"     = 5
    "DateTime"= (Get-Date)
    "Array"   = @("A", "B", "C")
}

$stringValues = @{
    "Boolean" = 'false'
    "Int"     = '10'
    "DateTime"= '2019-01-02 14:45:59.146'
    "Array"   = '@("X", "Y", "Z")'
}

"INITIAL VALUES:"
foreach ($key in $values.Keys) {
    ($key + " = " + $values[$key] + " (" + $values[$key].GetType().FullName + ")")
}

"`nUPDATING..."
foreach ($key in $stringValues.Keys) {
    $values[$key] = $stringValues[$key]
}

"`nUPDATED VALUES:"
foreach ($key in $values.Keys) {
    ($key + " = " + $values[$key] + " (" + $values[$key].GetType().FullName + ")")
}

输出:

INITIAL VALUES:
DateTime = 04/23/2019 16:54:13 (System.DateTime)
Array = A B C (System.Object[])
Boolean = True (System.Boolean)
Int = 5 (System.Int32)

UPDATING...

UPDATED VALUES:
DateTime = 2019-01-02 14:45:59.146 (System.String)
Array = @("X", "Y", "Z") (System.String)
Boolean = false (System.String)
Int = 10 (System.String)

我需要更新的值来匹配原始数据类型,而不仅仅是转换为System.String.

我对字符串的内容很灵活。例如,保存布尔false值的字符串可能是$false/ false/ [boolean]false/ [boolean]$false/etc 或保存数组的字符串可能使用不同的格式(基本上,任何更容易将字符串转换为适当数据类型的格式)。

本质上,我想模拟ConvertFrom-Jsoncmdlet 在从 JSON 字符串设置对象属性时所做的任何事情,只是在我的情况下,我没有 JSON 结构。

(如果有人想知道我要做什么:我正在尝试将 INI 文件解析器添加到我的ConfigFile 模块,不,我不能只使用哈希来返回 INI 设置;我需要将值加载到对应PSVariable的 s 并且为此工作,我需要将字符串转换为正确的数据类型。)

标签: powershelldynamictypescasting

解决方案


所以你想将新值转换/转换为旧值的类型。

这个想法需要从变量中转换,
这里有一个相关的问题powershell-type-cast-using-type-stored-in-variable

答案建议:

您可以使用以下方法大致模拟演员阵容: [System.Management.Automation.LanguagePrimitives]::ConvertTo($Value, $TargetType)

以下更改的例程表明:并不是那么简单,尤其是当新数据需要在转换中重载/其他参数时。

"UPDATING..."
foreach ($key in $stringValues.Keys) {
    $values[$key] = [System.Management.Automation.LanguagePrimitives]::ConvertTo(
                    $stringValues[$key], $values[$key].gettype())
}

我的德语语言环境错误消息:

Ausnahme beim Aufrufen von "ConvertTo" mit 2 Argument(en): "Der Wert "2019-01-02 14:45.59.146" kann nicht in den Typ "System.DateTime" konvertiert werden. Fehler: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."" In Zeile:2 Zeichen:5 + $values[$key] = [System.Management.Automation.LanguagePrimitives] ... + ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : PSInvalidCastException

和不充分的结果:

DateTime = 04/24/2019 09:49:19 (System.DateTime)
Array = @("X", "Y", "Z") (System.Object[])
Boolean = True (System.Boolean)
Int = 10 (System.Int32)

您可以详细说明这个想法,更单独地处理旧类型/新数据。


推荐阅读