powershell - 如何在 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-Json
cmdlet 在从 JSON 字符串设置对象属性时所做的任何事情,只是在我的情况下,我没有 JSON 结构。
(如果有人想知道我要做什么:我正在尝试将 INI 文件解析器添加到我的ConfigFile 模块,不,我不能只使用哈希来返回 INI 设置;我需要将值加载到对应PSVariable
的 s 并且为此工作,我需要将字符串转换为正确的数据类型。)
解决方案
所以你想将新值转换/转换为旧值的类型。
这个想法需要从变量中转换,
这里有一个相关的问题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)
您可以详细说明这个想法,更单独地处理旧类型/新数据。
推荐阅读
- c# - 使用 Ef core 3.1 从 Db 获取相关数据
- php - 如何使用 HTTP 请求或 PHP 中的 Guzzle 客户端通过请求的页面获取最后一个重定向页面
- xamarin.android - 使用 ocr 时打开手电筒时应用程序崩溃
- reactjs - 使用@reach/router 时如何设置搜索参数
- azure - 我可以在 Visual Studio Code 中使用 cmd 而不是 PowerShell 启动 az login 吗?
- bazel - 有没有办法在每次 bazel 调用时使用 local=True 执行 repository_rule ?
- docker - 这个 Rest api 和 nginx 前端反向代理我做错了什么?
- nginx - 为什么我在点击所有 API 后丢失了 WSO2 APIM 商店会话?
- javascript - 无法在 Angular 中使用 ViewChild 访问子组件
- c++ - 浮点异常:史密斯数检查中的 8