PowerShell中Select-Object返回全属性而非指定VersionInfo问题求助
问题分析与解决办法
核心原因
大概率是文件句柄未释放+PowerShell对象缓存导致的:
- 应用升级时,msiexec或其调用的子进程可能还在占用目标.exe/.dll文件,此时
Get-ChildItem读取的文件元数据不完整,Select-Object -ExpandProperty VersionInfo无法正常提取指定属性,就会 fallback 返回文件的所有属性。 - PowerShell在同一会话中会缓存文件对象的部分信息,即使文件已更新,缓存的旧对象也会干扰属性读取;重启脚本相当于清空了会话缓存,所以恢复正常。
具体解决办法
1. 确保msiexec完全执行完毕
别直接用msiexec /i ...,改用Start-Process强制等待安装进程结束,避免安装未完成就执行版本检索:
Start-Process msiexec.exe -ArgumentList "/i C:\path\to\your.msi /qn" -Wait -NoNewWindow
注:/qn是静默安装参数,可根据你的实际需求调整。
2. 强制回收文件资源,清除缓存
在安装完成后、版本检索前,添加以下命令释放文件句柄并刷新文件系统缓存:
# 强制垃圾回收,释放未关闭的文件句柄 [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers() # 刷新目标文件夹的元数据,触发PowerShell更新缓存 Update-ItemProperty -Path C:\[FolderName] -Name LastWriteTime -Value (Get-Date)
3. 直接读取文件版本,绕开Get-ChildItem的缓存
放弃管道方式,直接用.NET方法读取目标文件的版本信息,可靠性更高:
# 定位目标文件 $targetFile = Get-ChildItem -Path C:\[FolderName]\* -Filter $record -Recurse -File # 直接调用.NET获取版本信息 if ($targetFile) { $versionInfo = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($targetFile.FullName) # 按需提取具体版本字段,比如ProductVersion或FileVersion Write-Output $versionInfo.ProductVersion }
4. 增加短暂延迟(兜底方案)
如果以上方法仍偶发问题,在安装后加几秒延迟,给系统足够时间完成文件更新和资源释放:
Start-Sleep -Seconds 5
内容的提问来源于stack exchange,提问作者RayC
相关产品推荐
相关产品推荐

