Назад | Перейти на главную страницу

Как работать с путями при создании псевдонима 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?

Я могу использовать следующее, используя 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'")
}