PowerShell数组拼接在Visual Studio预生成事件触发op_Addition缺失报错
报错原因
这个错误出现的核心原因是:当Get-ChildItem执行后没有找到匹配的文件时,返回的结果不是空数组,而是$null;如果仅找到1个匹配文件,返回的是单个FileInfo对象,而非单元素数组。
此时你直接用+运算符对这些非数组类型的结果做拼接时,PowerShell找不到对应类型的加法实现(也就是报错里提到的op_Addition方法),就会抛出异常。
在Visual Studio预生成事件场景下,默认执行目录、项目结构差异都可能导致某个配置文件不存在,触发这个问题。
解决方法
下面提供两种可行的修复方案:
方案1:强制所有查询结果返回数组
在每个Get-ChildItem外层包裹@(),强制将查询结果转为数组类型,就算没有匹配结果也会返回空数组,数组相加不会报错。
修改后的代码如下:
$files_AppConfig = @(Get-ChildItem -Path .\App.config -Recurse) $files_WatcherConfig = @(Get-ChildItem -Path .\WatcherServiceConfig.xml -Recurse) $files_StrControles = @(Get-ChildItem -Path .\Web.config -Recurse) $files = $files_AppConfig + $files_WatcherConfig + $files_StrControles ForEach($file in $files) { #Do some stuff }
方案2:简化查询逻辑,一次性匹配所有目标文件
不需要分开查询三个文件再加总,直接用-Include参数一次性指定所有要匹配的文件名,代码更简洁,也不会出现类型相加的问题:
$files = Get-ChildItem -Path .\ -Recurse -Include App.config, WatcherServiceConfig.xml, Web.config ForEach($file in $files) { #Do some stuff }
内容的提问来源于stack exchange,提问作者Foxhunt
相关产品推荐
相关产品推荐

