批处理-PowerShell混合脚本中变量值拼接失败求助
解决PowerShell嵌套字典值拼接时输出类型名的问题
我一眼就看出问题所在了——你在PowerShell里拼接字符串时,没有正确求值嵌套字典的索引值,导致PowerShell把字典对象的类型名输出了,而不是实际的版本号。
问题根源
当你写$package@$obj[$key][$package]时,PowerShell会把$obj[$key][$package]当成一个未被完整求值的表达式,在字符串上下文里,它无法直接解析为字符串,所以就输出了这个字典对象的类型全称System.Collections.Generic.Dictionary2[System.String,System.Object][dependencies][@types/react]`。
修复方案
你需要用$()将嵌套的索引表达式包裹起来,强制PowerShell先计算出实际的版本值,再进行字符串拼接。修改PowerShell部分的循环代码即可:
foreach ($key in $obj.keys) { foreach($package in $obj[$key].keys){ # 用$()包裹索引表达式,确保先求值再拼接 echo "$package@$($obj[$key][$package])" >> packages.txt } }
或者你也可以先把版本号存入一个变量,再拼接,这样更清晰:
foreach ($key in $obj.keys) { foreach($package in $obj[$key].keys){ $version = $obj[$key][$package] echo "$package@$version" >> packages.txt } }
验证效果
修改后运行脚本,packages.txt里就会得到你预期的输出:
@types/react@16.3.10 react@16.3.2 react-dom@16.3.2 react-scripts@1.1.4
内容的提问来源于stack exchange,提问作者Sujit.Warrier
相关产品推荐
相关产品推荐

