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"
Пакет включает в себя несколько коротких сценариев оболочки
которые находят информацию и записывают ее в переменные окружения.
Если эти сценарии оболочки не работают для вас, свяжитесь со мной с более подробной информацией
и я придумаю что нибудь