为 Windows Subsystem for Linux 命令创建 PowerShell 别名时如何处理路径?

为 Windows Subsystem for Linux 命令创建 PowerShell 别名时如何处理路径?

我正在更新我的 PowerShell 别名以包含 Windows Subsystem for Linux 中的实用程序。例如,我想从 PowerShell 启动 vim。

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]在状态行中)。

我开始尝试替换字符串(\用替换/),但这只能解决没有锚点的相对路径,而字符串操作似乎不是正确的解决方案。此外,驱动器号映射到 Linux 中的 mnts,所以我需要处理这个问题。

有没有办法将 Windows 中的文件路径转换为 ​​Windows Subsystem for 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,这是一个修补到 wsl 中的 Linux 命令。现在你可以这样做 -

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'")
}

相关内容