我创建一个PowerShell脚本只是为了备份我的WSL发行版,但是当我尝试使用变量运行命令时,它会显示使用文本,就好像我提供了不正确的参数一样。
$DistrosArray1 = (wsl -l --quiet) | where {$_ -ne ""}
$DistrosArray2 = 'Arch', 'Ubuntu-22.04', 'docker-desktop-data', 'docker-desktop'
$CheckArrayDifference = Compare-Object -ReferenceObject $DistrosArray1 -DifferenceObject $DistrosArray2 -PassThru
echo $CheckArrayDifference
# Does not return anything (there is no difference)
foreach ($Distro in $DistrosArray1) {
wsl --export $Distro "$Distro.tar"
# This method is not working
}
foreach ($Distro in $DistrosArray2) {
wsl --export $Distro "$Distro.tar"
# This method is working
}发布于 2022-05-20 20:53:03
听起来好像您遇到了问题#4607的复杂性-- wsl.exe命令输出了一些奇怪的错误的UTF16编码,当试图从PowerShell (甚至从WSL内部)处理它时会产生问题。
现在在最新的WSL预览版0.64.0中已经修复了这个问题,但是您必须“选择”修复,这样旧的解决方案(比如@Bender和我提供的方法)就不会在不经意间中断。
简单设置:
$env:WSL_UTF8=1..。在您的代码之前,WSL将不再吐出“损坏的UTF16”。
我在答覆中的其他例子:
旧解决方案:
让我们简化这个问题,并做一个“安全”的例子,不尝试导出:
$DistrosArray1 = (wsl -l --quiet) | where {$_ -ne ""}
wsl -d $DistrosArray1[0]在以下方面的成果:
There is no distribution with the supplied name.我已经成功地使用了这句话中的方法来处理它。对于这个特殊的例子:
$console = ([console]::OutputEncoding)
[console]::OutputEncoding = New-Object System.Text.UnicodeEncoding
$DistrosArray1 = (wsl -l --quiet) | where {$_ -ne ""}
wsl -d $DistrosArray1[0]这将正确地运行列表中的第一个发行版。
使用以下内容重置编码:
[console]::OutputEncoding = $console对于大多数非交互式脚本来说,这不应该是一个问题,因为它只是“包装器”的最后一行,但是正如@BendertheGreatest在评论中所指出的,这是一个关键的步骤。
发布于 2022-05-20 20:49:02
输出。下面是我从关于这个问题的解决方案中得出的结论:
$DistrosArray1 = wsl -l --quiet | wsl iconv -c -f utf16 -t ascii
foreach ($Distro in $DistrosArray1) {
wsl --export $Distro "$Distro.tar"
}不幸的是,我无法将其转换为UTF8 (将ascii转换为utf8会产生额外的垃圾字符,尽管在有限的测试中它们是一致的和可检测的),所以只有ASCII范围以外的任何字符可能会给您带来问题。
https://stackoverflow.com/questions/72323974
复制相似问题