PowerShell参数补全异常:无符合条件文件时展示错误内容
修复WDAC模块的.cer文件参数补全问题
方案1:修复Register-ArgumentCompleter版本
修改后的脚本块会递归搜索当前及子目录的.cer文件,无匹配时返回空结果,避免默认补全无关内容:
$ArgumentCompleterCertPath = { # 递归搜索.cer文件,静默处理错误 $cerFiles = Get-ChildItem -Recurse -Filter *.cer -File -ErrorAction SilentlyContinue # 仅返回带引号的文件全路径,无匹配时返回空数组 if ($cerFiles) { $cerFiles | ForEach-Object { "`"$($_.FullName)`"" } } else { @() } } Register-ArgumentCompleter -CommandName "Edit-SignedWDACConfig" -ParameterName "CertPath" -ScriptBlock $ArgumentCompleterCertPath
关键改动:
- 添加
-Recurse递归搜索子目录 - 用
-Filter *.cer替代Where-Object,提升搜索效率 - 增加
-File确保只返回文件,排除文件夹 - 无匹配时返回空数组
@(),阻止PowerShell触发默认补全逻辑 - 使用
FullName返回完整路径,方便直接取用
方案2:修复属性式[ArgumentCompleter]版本
这个版本会适配用户已输入的路径片段,递归搜索.cer文件,无匹配时不返回任何结果:
[ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst) # 处理用户已输入的路径,默认使用当前目录 $targetPath = if ($wordToComplete) { # 尝试解析已输入的路径片段 try { Resolve-Path -LiteralPath $wordToComplete -ErrorAction Stop } catch { # 若路径不存在,取其目录部分或当前目录 $parentPath = Split-Path -LiteralPath $wordToComplete -Parent if (-not $parentPath) { $pwd.Path } else { $parentPath } } } else { $pwd.Path } # 递归搜索.cer文件,静默处理错误 $cerFiles = Get-ChildItem -LiteralPath $targetPath -Recurse -Filter *.cer -File -ErrorAction SilentlyContinue # 生成补全结果,无匹配时返回空 if ($cerFiles) { foreach ($file in $cerFiles) { # 根据用户输入自动适配显示相对路径或全路径 $displayPath = if ($wordToComplete) { $file.FullName.Substring($targetPath.Length).TrimStart('\') } else { $file.FullName } [System.Management.Automation.CompletionResult]::new( "`"$($file.FullName)`"", $displayPath, 'ParameterValue', $file.FullName ) } } else { @() } })]
关键改动:
- 处理
$wordToComplete参数,适配用户正在输入的路径片段 - 优化路径解析逻辑,避免因路径不存在导致的错误
- 添加
-Recurse和-File确保只递归搜索目标文件 - 无匹配时返回空数组,彻底阻止默认补全
- 补全结果自动适配用户输入,显示相对路径更友好
核心解决逻辑
两个方案均实现了需求:
- 递归搜索当前及所有子目录的
.cer文件 - 无匹配文件时返回空数组,避免展示无关的文件/文件夹
- 静默处理路径解析错误,不会弹出错误提示
内容的提问来源于stack exchange,提问作者SpyNet
相关产品推荐
相关产品推荐

