SVN INFO 在 CD 进入工作副本时在 PowerShell 中失败,同时用错误的字母大小写拼写目录名称

SVN INFO fails in PowerShell when CD'ing into a working copy while spelling the directory name with wrong letter case

当我使用 Set-Location(又名 cd)更改 PowerShell 中的当前目录时 window,但故意避免自动完成并在 [=36] 中键入名称=] 案例...

PS C:\> Set-Location winDOWs

...然后 Get-Location(又名 pwd)将 return 即 "wrong" 路径名:

PS C:\winDOWs> Get-Location

Path
----
C:\winDOWs

这会导致 svn info 出现问题:

PS C:\svn\myDir> svn info --show-item last-changed-revision
2168
PS C:\svn\myDir> cd ..\MYDIR
PS C:\svn\MYDIR> svn info --show-item last-changed-revision
svn: warning: W155010: The node 'C:\svn\MYDIR' was not found.

svn: E200009: Could not display info for all targets because some targets don't exist

如您所见,当用户在 cd 中输入工作副本目录 "myDir" 的名称时,字母大小写不正确,svn info 将失败。

有办法解决吗?我找不到 svn info.

的合适参数

另一种选择可能是覆盖 PowerShell 的 cd 别名,并确保在实际 cd'ing 之前固定输入路径的字母大小写,但如何实现呢? Resolve-Path,例如还 returns "wrong" 目录名。

类似这样的东西可能对你有用:

Set-Location C:\winDOWs\sysTEm32    
$currentLocation = (Get-Location).Path
$folder = Split-Path $currentLocation -Leaf
$casedPath = ([System.IO.DirectoryInfo]$currentLocation).Parent.GetFileSystemInfos($folder).FullName

# if original path and new path are equal (case insensitive) but are different with case-sensitivity. cd to new path.
if($currentLocation -ieq $casedPath -and $currentLocation -cne $casedPath)
{
    Set-Location -LiteralPath $casedPath 
}

这将为您提供路径 "System32" 部分的正确大小写。您将需要为路径的所有部分递归调用这段代码,例如C:\Windows, C:\Windows\System32, 等等

最终递归函数

给你:

function Get-CaseSensitivePath
{
    param([System.IO.DirectoryInfo]$currentPath)

    $parent = ([System.IO.DirectoryInfo]$currentPath).Parent
    if($null -eq $parent)
    {
        return $currentPath.Name
    }

    return Join-Path (Get-CaseSensitivePath $parent) $parent.GetDirectories($currentPath.Name).Name

}

示例:

Set-Location (Get-CaseSensitivePath C:\winDOWs\sysTEm32)