据我所知,性能问题实际上在于 SqlServer psprovider 中 Resolve-Path 的实现。Resolve-Path 是 TabExpansion 的默认实现(在 Powershell v2 中)如何完成路径完成。
通过覆盖 TabExpansion 函数以使用 Get-ChildItem 和 Where-Object 而不是 Resolve-Path,我能够解决此问题。你可以在这个 bitbucket repo 中找到最新的实现。
这是当前的实现:
function TabExpansion($line, $lastWord) {
if (!((get-location).Provider.Name -eq "SqlServer")) {
TabExpansionSqlPsBackup $line $lastWord
}
else {
$index = $lastWord.LastIndexOfAny(@('\', '/'))
if ($index -gt -1) {
$parent = $lastWord.substring(0, $index+1)
$leaf = $lastWord.substring($index+1)
}
else {
$parent = ""
$leaf = $lastWord
}
$matches = ls -path $parent | ?{ $_.PSChildName -match "^$leaf" }
if ($matches) {
$matches | %{ $parent + $_.PSChildName }
}
else {$lastWord}
}
}
将该函数放入位于 ~\Documents\WindowsPowerShell\Microsoft.SqlServer.Management.PowerShell.sqlps_profile.ps1 的 sqlps 配置文件中