如何用PowerShell的ForEach循环读取.exe版本并执行对应批次函数
现有代码核心问题
- 数据类型不匹配:你已经提前取出了
ProductVersion字符串存入数组,循环时又调用$item.VersionInfo.ProductVersion,属于重复取值且无法拿到有效数据 - 语法结构错误:
if代码块提前闭合,elseif分支写在foreach循环外,逻辑完全无法正常执行 - 变量定义错误:重复给
$prod3赋值,数组引用的$prod4未声明 - 版本匹配逻辑错误:版本号为字符串类型,直接和数字
15.9/16.0对比永远不成立
推荐实现方案
优先用路径批量遍历的写法,扩展性更高:
# 统一维护待检测的exe路径,新增文件直接修改该数组即可 $targetExePaths = @( "C:\Program Files\App1\app.exe", "D:\Tools\App2\app.exe", "C:\Program Files (x86)\App3\app.exe", "D:\Personal\App4\app.exe" ) foreach ($exePath in $targetExePaths) { # 前置校验文件存在性,避免异常报错 if (-not (Test-Path -Path $exePath -PathType Leaf)) { Write-Warning "路径不存在,跳过处理:$exePath" continue } # 获取产品版本号 $currentVer = (Get-Item -Path $exePath).VersionInfo.ProductVersion Write-Host "当前处理文件:$exePath 版本号:$currentVer" # 版本匹配分支,支持通配符适配子版本 switch -Wildcard ($currentVer) { "15.9*" { # 此处写入15.9版本对应的处理逻辑 Write-Host "执行15.9版本专属操作" } "16.0*" { # 此处写入16.0版本对应的处理逻辑 Write-Host "执行16.0版本专属操作" } default { # 无匹配版本的兜底逻辑,可根据需求调整 Write-Host "未匹配到对应处理规则,跳过当前文件" } } }
兼容原有函数写法的调整版
如果需要保留你原有的函数封装逻辑,修改后代码如下:
function Process-EXEByVersion { $prod1 = (Get-Item "路径1").VersionInfo.ProductVersion $prod2 = (Get-Item "路径2").VersionInfo.ProductVersion $prod3 = (Get-Item "路径3").VersionInfo.ProductVersion $prod4 = (Get-Item "路径4").VersionInfo.ProductVersion $verArray = @($prod1, $prod2, $prod3, $prod4) foreach ($ver in $verArray) { if ($ver -like "15.9*") { # 15.9版本处理逻辑 } elseif ($ver -like "16.0*") { # 16.0版本处理逻辑 } } } # 调用函数执行逻辑 Process-EXEByVersion
注意事项
- 版本匹配优先用
-like加通配符*,不需要完全匹配完整版本号,同大版本下的子版本都能命中规则 - 建议保留文件存在性校验逻辑,避免路径配置错误导致脚本直接崩溃
- 多版本分支较多时用
switch语句比多层if/elseif可读性更高,新增版本规则也更方便
内容的提问来源于stack exchange,提问作者Treeman
相关产品推荐
相关产品推荐

