Как мне работать с путями при создании псевдонима PowerShell для команды подсистемы Windows для Linux?

Я обновляю псевдонимы PowerShell для включения утилит из подсистемы Windows для Linux. Например, я хочу запустить vim из PowerShell.

Set-Alias -name 'vim' -Value 'Start-Vim'

function Start-Vim {
    wsl vim $args
}

Этот псевдоним отлично работает, если я передаю простое имя файла (например, vim note.txt), но он не работает, если я передаю абсолютный путь к файлу, относительный путь с привязкой .\ или относительный путь без привязки.

Я пытался использовать Resolve-Path, чтобы хотя бы добраться до одного места (полностью разрешенный путь), но это все равно не работает. Он запускает vim, но с этим путем в качестве нового файла ("C:\temp\APIM Swap.ps1" [New File] в строке состояния).

Я начал путь замены строк (заменить \ с /), но это решает только относительный путь без привязки, и манипулирование строками не похоже на правильное решение. Кроме того, буквы дисков отображаются на MNTS в Linux, поэтому мне нужно с этим справиться.

Есть ли способ преобразовать путь к файлу в Windows в его путь к файлу в подсистеме Windows для Linux? Или есть другой способ интеграции утилит WSL?

1 ответ

Решение

Я могу использовать следующее, используя Windows 10 Home 177763 и Alpine WSL.

Set-Alias -name 'vi' -Value 'Start-Vi'
function Start-Vi {
    wsl vi (Resolve-Path -Relative $args)
}

Обратите внимание, что это может произойти, если вы не предоставите аргумент для функции, или если ваш путь будет глубже, чем рабочий каталог.

* ОБНОВИТЬ *

Итак, я пошел и посмотрел на wslpath, команду linux, исправленную в wsl. Теперь вы можете сделать это -

Set-Alias -name 'wslpath' -Value 'Get-WSLPath'
function Get-WSLPath {
    $strlit='"'
    wsl wslpath $strlit$args$strlit
}
Set-Alias -name 'nano' -Value 'Start-Nano'
function Start-Nano {
    wsl nano $args
}

который позволяет вам запустить следующий кусок некрасивого кода

nano (wslpath .\.ssh\known_hosts)  

который теперь работает для любого относительного пути, но бомбы, если нет аргументов.

* ОБНОВЛЕНИЕ СНОВА *

И, конечно, большая часть этого совершенно не нужна, потому что вы можете просто использовать:

Set-Alias -name 'vi' -Value 'Start-Vi'
function Start-Vi {
    wsl vi (wsl wslpath "'$args'")
}
Другие вопросы по тегам