首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用数组变量的powershell脚本

不使用数组变量的powershell脚本
EN

Stack Overflow用户
提问于 2022-05-20 19:30:10
回答 2查看 288关注 0票数 2

我创建一个PowerShell脚本只是为了备份我的WSL发行版,但是当我尝试使用变量运行命令时,它会显示使用文本,就好像我提供了不正确的参数一样。

代码语言:javascript
复制
$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
  }
EN

回答 2

Stack Overflow用户

发布于 2022-05-20 20:53:03

听起来好像您遇到了问题#4607的复杂性-- wsl.exe命令输出了一些奇怪的错误的UTF16编码,当试图从PowerShell (甚至从WSL内部)处理它时会产生问题。

现在在最新的WSL预览版0.64.0中已经修复了这个问题,但是您必须“选择”修复,这样旧的解决方案(比如@Bender和我提供的方法)就不会在不经意间中断。

简单设置:

代码语言:javascript
复制
$env:WSL_UTF8=1

..。在您的代码之前,WSL将不再吐出“损坏的UTF16”。

我在答覆中的其他例子:

旧解决方案:

让我们简化这个问题,并做一个“安全”的例子,不尝试导出:

代码语言:javascript
复制
$DistrosArray1 =  (wsl -l --quiet) | where {$_ -ne ""}
wsl -d $DistrosArray1[0]

在以下方面的成果:

代码语言:javascript
复制
There is no distribution with the supplied name.

我已经成功地使用了这句话中的方法来处理它。对于这个特殊的例子:

代码语言:javascript
复制
$console = ([console]::OutputEncoding)
[console]::OutputEncoding = New-Object System.Text.UnicodeEncoding
$DistrosArray1 =  (wsl -l --quiet) | where {$_ -ne ""}
wsl -d $DistrosArray1[0]

这将正确地运行列表中的第一个发行版。

使用以下内容重置编码:

代码语言:javascript
复制
[console]::OutputEncoding = $console

对于大多数非交互式脚本来说,这不应该是一个问题,因为它只是“包装器”的最后一行,但是正如@BendertheGreatest在评论中所指出的,这是一个关键的步骤。

票数 2
EN

Stack Overflow用户

发布于 2022-05-20 20:49:02

输出。下面是我从关于这个问题的解决方案中得出的结论:

代码语言:javascript
复制
$DistrosArray1 = wsl -l --quiet | wsl iconv -c -f utf16 -t ascii

foreach ($Distro in $DistrosArray1) {
  wsl --export $Distro "$Distro.tar"
}

不幸的是,我无法将其转换为UTF8 (将ascii转换为utf8会产生额外的垃圾字符,尽管在有限的测试中它们是一致的和可检测的),所以只有ASCII范围以外的任何字符可能会给您带来问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72323974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档