ConvertFrom-StringData生成对象数组而非哈希表的问题排查
问题:PowerShell中将文本转换为哈希表失败,返回数组而非哈希表
问题场景
有如下内容的文本文件:
K:=\\kiefs83001\digipack O:=\\kiefs73001\sws02\digipack
尝试转换为哈希表时,执行$hash["K:"]返回空,$hash.GetType()显示结果是Object[](数组),而非预期的哈希表。
原操作代码:
$content = get-content "textfile.txt" # 转义反斜杠以进行下一步操作 $content = $content.Replace("\\", "\\\\"); $hash = $content | ConvertFrom-StringData # 应生成哈希表
执行$hash输出看似正常:
Name Value ---- ----- K: \\kiefs83001\digipack O: \\kiefs73001\sws02\digipack
但后续访问键值或尝试转换时报错:
$newhash = @{} $hash | ForEach-Object { $newhash[$_.key] = $_.value }
报错信息:
Error during indexing. The Arrayindex is NULL + $hash[$_.key] = $_.value + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : NullArrayIndex
错误原因
Get-Content返回值类型问题:默认情况下Get-Content会将文件按行拆分为字符串数组,而非单个字符串。当把数组传给ConvertFrom-StringData时,cmdlet会对数组中的每一行单独处理,生成一个仅包含单个键值对的哈希表,最终返回的是哈希表数组,而非单个合并后的哈希表。这就是$hash.GetType()显示为Object[]的原因。- 多余的反斜杠转义:
ConvertFrom-StringData不需要手动转义反斜杠,原代码中的Replace操作反而会导致路径中的反斜杠重复,属于无效操作。
解决方法
方法1:使用-Raw参数读取整个文件为单字符串(PowerShell 3.0+)
-Raw参数会直接将整个文件内容读取为单个字符串,ConvertFrom-StringData可以直接解析为单个哈希表:
$content = Get-Content "textfile.txt" -Raw $hash = $content | ConvertFrom-StringData
方法2:合并数组为单字符串(兼容旧版本PowerShell)
如果使用的是PowerShell 2.0及以下版本,没有-Raw参数,可以手动将数组元素合并为单个字符串:
$content = (Get-Content "textfile.txt") -Join "`n" $hash = $content | ConvertFrom-StringData
验证结果
执行上述代码后:
$hash["K:"]会返回正确的路径\\kiefs83001\digipack$hash.GetType()会显示Hashtable,确认是单个哈希表
内容的提问来源于stack exchange,提问作者Bernd
相关产品推荐
相关产品推荐

