PowerShell命令直接运行正常,存为.ps1脚本执行报类型转换错误
问题根因
- 参数符号错误:你代码中
Get-AppxPackage –AllUsers里的参数前缀是全角长破折号–,并非PowerShell语法要求的半角减号-。PowerShell交互式运行时会对输入字符做兼容转换,可识别该符号为参数前缀,但脚本执行时语法解析逻辑更严格,不会自动转换该字符,导致AllUsers没有被识别为开关参数,反而将后续的数组内容传入Get-AppxPackage的第一个位置参数-Name,-Name要求字符串类型,传入对象数组就抛出了类型转换错误。 - 语法优先级错误:
-join是PowerShell的运算符,不是Write-Output的参数。该写法在交互式环境下因解析顺序容错性高可勉强运行,但脚本模式下参数解析逻辑更严谨,会导致整体命令的参数解析完全混乱。 - 潜在兼容问题:
Get-WmiObject已被官方弃用,且Win32_Product类查询时会触发所有MSI安装包的完整性校验,可能导致意外的配置修改,不建议使用。
修复方案
修正后的代码如下:
# 分别提取三类信息并转为结构化JSON字符串,避免对象直接拼接出现类型异常 $sysInfo = Get-ComputerInfo | ConvertTo-Json -Depth 10 $appxInfo = Get-AppxPackage -AllUsers | ConvertTo-Json -Depth 10 $win32AppInfo = Get-CimInstance -Class Win32_Product | ConvertTo-Json -Depth 10 # 拼接后输出为UTF8编码的文本文件 ($sysInfo, ",", $appxInfo, ",", $win32AppInfo) -join "" | Out-File .\a.txt -Encoding UTF8
你也可以根据需求将ConvertTo-Json替换为Out-String,直接导出纯文本格式的信息。
内容的提问来源于stack exchange,提问作者Bhargav
相关产品推荐
相关产品推荐

