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