当我使用Set-Location
(又名cd
)更改PowerShell窗口中的当前目录时,故意避免自动完成并在"错误"中键入名称。情况下...
PS C:\> Set-Location winDOWs
...然后Get-Location
(又名pwd
)将返回"错误"路径名称:
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
正如您所看到的,当用户没有输入工作副本目录的名称时,svn info
失败了#34; myDir"在cd
进入{。}}时使用正确的字母大小写。
有没有办法解决这个问题?我找不到合适的svn info
参数。
另一种选择可能是覆盖PowerShell的cd
别名,并确保在实际cd
之前确定输入路径的字母大小写,但如何实现?例如Resolve-Path
也会返回"错误"目录名称。
答案 0 :(得分:1)
这样的事可能适合你:
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)