PowerShell:在所有WSL2虚拟机上执行命令



我不认为这个问题需要很多澄清,特别是当你看到我的尝试:

wsl -l -q --running | Where{$_ -ne ""} | ForEach {Write-Output "Distro $_"; wsl -d $_ -e ls; Write-Output "/// $_"}

我希望/期望上面写"Distro (distribution name)";在控制台上,然后在该发行版上执行ls,然后写入"/// (distribution name)";最后在控制台中为每个活动虚拟机设置。不工作的部分是ls-而不是执行ls,我从wsl获得通用帮助消息.

我认为我没有正确地转义某些东西,因为如果我试图通过删除发行版名称参数(即wsl -d -e ls而不是wsl -d $_ -e ls)来故意破坏命令,我会得到一个合理的错误消息(There is no distribution with the supplied name.)而不是通用的帮助消息。

另一方面,如果我只是在控制台中手动运行wsl -d Ubuntu-20.04 -e ls,其行为与预期一致。

我做错了什么?

原来我的问题是由wsl引起的。令人惊讶的是,它以一种奇怪的编码方式吐出发行版的名字,然后在反馈给它时拒绝它。查看一下:

wsl -l | Format-Hex

我的解决方案(至少目前)是从wsl的输出中删除空字符:

(wsl -l) -replace "`0", "" | Format-Hex

看起来好多了。

我们只需要在原始脚本中使用这个技巧:

(wsl -l -q --running) -replace "`0", "" | Where{$_ -ne ""} | ForEach {Write-Output "Distro $_"; wsl -d $_ -e ls; Write-Output "/// $_"}

相关内容

  • 没有找到相关文章

最新更新