Powershell получает путь с учетом регистра, как показано в Windows

Я ищу способ получить мой локальный путь, который включает любые случаи верблюда, которые используются в именах. Основная причина заключается в том, что я могу использовать тот же путь, чтобы сделать вызов в Windows WSL. Например, в Windows я могу назвать файл как

c:\FoO\bar.txt 
c:\Foo\Bar.txt

и окна будут отображать его как c:\foo\bar.txt, Когда я пытаюсь войти в WSL с помощью bash, мне нужно знать фактический путь, поскольку Linux чувствителен к регистру.

Я пытался использовать

$PSScriptRoot
Split-path C:\FoO\Bar.txt
(get-Item c:\Foo\Bar.txt).FullName

но они будут указывать только путь к скрипту.
Как мне получить мой путь, как он отображается в ОС Windows? Я не могу просто назвать полный путь к нужному файлу, так как не могу гарантировать, что он находится в корневом каталоге. Я также не хочу сжигать циклы, делая поиск.

4 ответа

Решение

То, что вы хотите, это посмотреть на Target собственность, от которой вы получаете Get-Item, Fullname вернусь, однако вы набрали его изначально, но Target на самом деле это свойство кода, которое, кажется, получает необработанный путь к объекту.

(get-Item c:\Foo\Bar.txt).Target

начиная с Windows 10,Targetнедвижимость пуста.
(Get-Item '....')не содержит свойств, содержащих имя с учетом регистра.

однако при получении всех дочерних элементов папки вы получаете все имена с учетом регистра.

поэтому мое решение такое:

      $myCaseInsensitiveFileName = 'c:\FoO\bar.txt'

$allFiles = Get-ChildItem 'c:\' -Recurse
$caseSensitiveName = $allFiles.FullName | Where-Object { $_.FullName -eq $myCaseInsensitiveFileName }

$caseSensitiveNameдержитC:\Foo\Bar.txt.

примечание:

  • это можно оптимизировать, но суть вы поняли.
  • тот-eqоператор сравнивает строки без учета регистра

Найдите каталог с помощью проводника Windows, и он покажет полный путь.
Найдите каталог в WSL или PowerShell, а "pwd" или "echo $PWD" даст полное имя пути.
Добавьте каталог в PATH в $HOME/.profile, и вам не нужен полный путь.

У меня есть несколько автоматизированных способов сделать это.
Смотрите http://contextknowledge.blog/
"Пакет myenv для Windows 10 + Cygwin + WSL/Ubuntu"
Пакет включает в себя несколько коротких сценариев оболочки
которые находят информацию и записывают ее в переменные окружения.
Если эти сценарии оболочки не работают для вас, свяжитесь со мной с более подробной информацией
и я придумаю что нибудь

Другие вопросы по тегам