PowerShell:在所有 WSL2 VM 上执行命令
PowerShell: executing a command on all WSL2 VMs
我认为这个问题不需要太多澄清,尤其是当您看到我的尝试时:
wsl -l -q --running | Where{$_ -ne ""} | ForEach {Write-Output "Distro $_"; wsl -d $_ -e ls; Write-Output "/// $_"}
我wanted/expected上面在控制台上写“Distro (distribution name)
”,然后在该分布上执行ls
,然后在控制台上写“/// (distribution name)
”最后,对于每个活动的虚拟机。不起作用的部分是 ls
– 而不是执行 ls
,我从 wsl
.[=21 获得通用帮助消息=]
我认为我没有正确转义某些东西,因为如果我试图通过删除发行版名称参数(即 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 "/// $_"}
我认为这个问题不需要太多澄清,尤其是当您看到我的尝试时:
wsl -l -q --running | Where{$_ -ne ""} | ForEach {Write-Output "Distro $_"; wsl -d $_ -e ls; Write-Output "/// $_"}
我wanted/expected上面在控制台上写“Distro (distribution name)
”,然后在该分布上执行ls
,然后在控制台上写“/// (distribution name)
”最后,对于每个活动的虚拟机。不起作用的部分是 ls
– 而不是执行 ls
,我从 wsl
.[=21 获得通用帮助消息=]
我认为我没有正确转义某些东西,因为如果我试图通过删除发行版名称参数(即 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 "/// $_"}