PowerShell脚本如何拼接已安装应用检测结果字符串
解决PowerShell检测应用结果换行问题
方法1:修改Write-Host添加-NoNewline参数
原脚本里的Write-Host默认会在输出后添加换行符,只需加上-NoNewline参数就能让结果连续输出,最后手动加个换行避免后续输出和当前结果连在一起。
修改后的代码:
clear $appsToCheck = "WebEx","Adobe Acrobat" function Check_Program_Installed { [CmdletBinding()] Param( [Parameter(Position = 0, Mandatory=$true, ValueFromPipeline = $true)] $Name ) $app = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -match $Name } | Select-Object DisplayName, DisplayVersion, InstallDate, Version if ($app) { Write-Host "$($app.DisplayName) v$($app.DisplayVersion) | " -NoNewline } } foreach ($app in $appsToCheck) { Check_Program_Installed "$app" } # 最后添加换行,避免后续命令输出和当前结果粘连 Write-Host ""
方法2:用变量收集结果后统一输出
这种方式更灵活,方便后续对结果做其他处理(比如写入文件、过滤内容):
clear $appsToCheck = "WebEx","Adobe Acrobat" $result = @() # 初始化空数组存储检测结果 function Check_Program_Installed { [CmdletBinding()] Param( [Parameter(Position = 0, Mandatory=$true, ValueFromPipeline = $true)] $Name ) $app = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -match $Name } | Select-Object DisplayName, DisplayVersion, InstallDate, Version if ($app) { return "$($app.DisplayName) v$($app.DisplayVersion) | " } } foreach ($app in $appsToCheck) { $output = Check_Program_Installed "$app" if ($output) { $result += $output } } # 将数组元素拼接成一行输出 Write-Host ($result -join "")
方法3:利用PowerShell管道和-join
更符合PowerShell管道式编程的写法,省略手动foreach循环:
clear $appsToCheck = "WebEx","Adobe Acrobat" function Check_Program_Installed { [CmdletBinding()] Param( [Parameter(Position = 0, Mandatory=$true, ValueFromPipeline = $true)] $Name ) process { # 处理管道输入的每个元素 $app = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -match $Name } | Select-Object DisplayName, DisplayVersion, InstallDate, Version if ($app) { "$($app.DisplayName) v$($app.DisplayVersion) | " } } } # 通过管道传递应用列表,拼接结果后输出 $appsToCheck | Check_Program_Installed | ForEach-Object { $_ } | -join "" | Write-Host
补充说明
- 方法1是最直接的修改方式,适合快速调整现有脚本;
- 方法2和3更符合PowerShell的最佳实践,函数返回数据而非直接输出,便于后续功能扩展;
- 若目标应用未安装,脚本会自动跳过,不会输出空内容。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

