You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:36:10