如何在PowerShell中为WSL2/Ubuntu 22.04执行链式命令并解决工作目录问题?
我太懂你碰到的这个糟心事了——想在PowerShell里给WSL发一串链式命令,结果用&&要么报错说找不到命令,要么变成WSL跑一个、PowerShell跑一个,而且WSL默认还不跟着PowerShell的当前目录走,确实折腾人!
先解决链式命令的核心问题
你试的wsl "ls && ls"之所以报错,是因为WSL会把整个引号里的内容当成单个命令去系统里找,而不是交给bash去解析命令链逻辑。正确的做法是显式调用bash,用-c参数把命令链传进去,让bash来处理&&这种逻辑:
wsl -e bash -c "ls && ls && echo '完成啦'"
这样所有的命令都会在WSL的bash环境里依次执行,完全符合你想要的链式效果。
再搞定工作目录不匹配的问题
至于WSL默认用/作为初始目录的问题,有两种省心的解决方式:
方式1:用WSL自带的--cd参数
WSL其实早就支持直接指定工作目录了,不用手动转换路径!你可以直接把PowerShell的当前目录传给--cd参数,再搭配上面的命令链写法:
wsl --cd "$(Get-Location)" -e bash -c "ls && pwd"
执行后你会发现,WSL直接切换到了PowerShell当前的文件夹,命令也都是在这个目录下执行的,是不是超省事?
方式2:用你自己写的PowerShell函数(更灵活)
你自己在Profile里写的getWSLPath和wslHere函数思路非常棒——自动把Windows路径转换成WSL能识别的/mnt/格式,还把命令执行和路径切换整合到一起。如果习惯用函数的话,这个方案定制性更强,比如你还可以给wslHere加个默认命令,比如没传命令时默认执行ls -la:
function wslHere([string] $command = "ls -la") { $path = getWSLPath wsl -e bash -c "cd '$path' && $command" }
这样调用wslHere的时候,直接就能在WSL的当前对应目录下执行默认命令,传参数的话就执行指定命令,用起来顺手得很。
总结一下
如果只是临时执行几次链式命令,用wsl --cd "$(Get-Location)" -e bash -c "命令1 && 命令2"就足够;如果经常需要这么操作,你的自定义函数方案是长期使用的最优解,还能根据自己的需求随时调整。
备注:内容来源于stack exchange,提问作者DeNice

