@@ -161,22 +161,10 @@ function Install-PackageManagerApps() {
161161 $cliName = if ($appInfo.cliName ) { $appInfo.cliName } else { $appInfo.name }
162162
163163 # 生成安装命令(如果未配置则根据包管理器自动生成)
164- $command = if ($appInfo.command ) {
165- $appInfo.command
166- }
167- else {
168- switch ($PackageManager.ToLower ()) {
169- ' choco' { " choco install $appName -y" }
170- ' scoop' { " scoop install $appName " }
171- ' winget' { " winget install $appName " }
172- ' cargo' { " cargo install $appName " }
173- ' homebrew' { " brew install $appName " }
174- ' apt' { " apt install $appName " }
175- default {
176- Write-Warning " 未知的包管理器: $PackageManager ,跳过 $appName "
177- continue
178- }
179- }
164+ $command = Get-PackageInstallCommand - PackageManager $PackageManager - AppName $appName - CustomCommand $appInfo.command
165+ if (-not $command ) {
166+ Write-Warning " 未知的包管理器: $PackageManager ,跳过 $appName "
167+ continue
180168 }
181169
182170 # 检查是否跳过安装
@@ -187,8 +175,16 @@ function Install-PackageManagerApps() {
187175
188176 # 执行安装逻辑
189177 try {
190- # 检查应用是否已安装
191- if (-not (Test-EXEProgram $cliName )) {
178+ # 检查应用是否已安装(使用更智能的检测方法)
179+ $isInstalled = if ($appInfo.filterCli ) {
180+ # 如果配置中指定仅检测CLI,则只检测命令行程序
181+ Test-ApplicationInstalled - AppName $cliName - FilterCli $true
182+ } else {
183+ # 默认检测所有类型(命令行和应用程序)
184+ Test-ApplicationInstalled - AppName $cliName
185+ }
186+
187+ if (-not $isInstalled ) {
192188 if ($PSCmdlet.ShouldProcess ($appName , " 安装应用" )) {
193189 Write-Host " 正在安装 $appName ..." - ForegroundColor Yellow
194190 Invoke-Expression $command
@@ -205,4 +201,58 @@ function Install-PackageManagerApps() {
205201 }
206202}
207203
204+ function Get-PackageInstallCommand {
205+ <#
206+ . SYNOPSIS
207+ 根据包管理器和应用名称生成安装命令
208+ . DESCRIPTION
209+ 根据指定的包管理器类型和应用名称,生成对应的安装命令。
210+ 如果提供了自定义命令,则优先使用自定义命令。
211+ . PARAMETER PackageManager
212+ 包管理器名称,支持:choco、scoop、winget、cargo、homebrew、apt
213+ . PARAMETER AppName
214+ 要安装的应用名称
215+ . PARAMETER CustomCommand
216+ 自定义安装命令(可选)
217+ . EXAMPLE
218+ Get-PackageInstallCommand -PackageManager "scoop" -AppName "git"
219+ 返回: "scoop install git"
220+ . EXAMPLE
221+ Get-PackageInstallCommand -PackageManager "choco" -AppName "nodejs" -CustomCommand "choco install nodejs.install -y"
222+ 返回: "choco install nodejs.install -y"
223+ . OUTPUTS
224+ [string] 安装命令字符串,如果包管理器不支持则返回 $null
225+ #>
226+ [CmdletBinding ()]
227+ param (
228+ [Parameter (Mandatory = $true )]
229+ [string ]$PackageManager ,
230+
231+ [Parameter (Mandatory = $true )]
232+ [string ]$AppName ,
233+
234+ [Parameter ()]
235+ [string ]$CustomCommand
236+ )
237+
238+ # 如果提供了自定义命令,优先使用
239+ if ($CustomCommand ) {
240+ return $CustomCommand
241+ }
242+
243+ # 根据包管理器生成默认安装命令
244+ switch ($PackageManager.ToLower ()) {
245+ ' choco' { return " choco install $AppName -y" }
246+ ' scoop' { return " scoop install $AppName " }
247+ ' winget' { return " winget install $AppName " }
248+ ' cargo' { return " cargo install $AppName " }
249+ ' homebrew' { return " brew install $AppName " }
250+ ' apt' { return " apt install $AppName " }
251+ default {
252+ Write-Verbose " 不支持的包管理器: $PackageManager "
253+ return $null
254+ }
255+ }
256+ }
257+
208258Export-ModuleMember - Function *
0 commit comments