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)
当我使用 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)