2017-02-06 23 views
0

Когда я использую Set-Location (aka cd), чтобы изменить текущий каталог в окне PowerShell, но преднамеренно избегать автозаполнения и введите имя в "неправильном" случае ...SVN INFO сбой в 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 терпит неудачу, когда пользователь не ввести имя рабочей копии каталога «Mydir» с правильной буквой случае, когда cd «ать в ней.

Есть ли способ решить эту проблему? Я не смог найти подходящий параметр svn info.

Другим вариантом может быть перезаписать псевдоним cd PowerShell и убедиться, что регистр букв типизированного пути исправлен до фактического cd 'ing, но как это сделать? Resolve-Path, например, также возвращает имя «неправильного» каталога.

+1

ли это ответить на ваши вопрос http://stackoverflow.com/questions/7195337/how-do-i-get-a-path-with-the-correct-canonical-case-in-powershell – Shmukko

+0

http: // get -carbon.org/Resolve-PathCase.html – gvee

ответ

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 и т.д.

Final рекурсивная функция

Здесь вы идете:

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) 
+0

Удивительный. Чистое решение PowerShell, которое, кажется, даже быстрее, чем [Resolve-PathCase от модуля Carbon PowerShell] (http://stackoverflow.com/a/9185476/1025555). –