Powershell编码原因导致部分代码不执行

Posted 神神的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powershell编码原因导致部分代码不执行相关的知识,希望对你有一定的参考价值。

遇到个奇怪问题, 一直运行正常的powershell脚本文件突然有一行语句死活都不执行.

排除所有程序逻辑等问题, 一摸一样的语句换到其他地方都可以运行, 发现唯独那个文件就那一行不管写任何语句都不执行, 最奇怪的是也没有任何错误提示.

经过一番测试, 发现和前一行的注释语句有关系, 删掉注释就可以正常运行了, 看来是忽视了微软产品的中文编码问题了.

由于我IDE中自动创建的文件都是默认 UTF-8 编码的, 而以前之所以都没有发现这个问题, 都运行正常, 是因为我之前注释的末尾都留有空格. 后来修改这个文件的时候, IDE 保存时自动清理代码, 将末尾的空格给清理掉了, 因此出现了中文编码问题, 导致下一行的语句都被识别为注释根本没有执行, 所以也没有报错.

测试文件: test1.sp1

echo "begin"
# 以"口"字结尾的的部分中文字符串, 如: 自动退出窗口
date; echo "line 4 --- "; echo "这是中文内容, 注释语句下面的这一行所有命令都不会被执行123456"; echo "--- line 4"
echo "end"

经测试, 注释部分出现中文乱码情况时, 某些中文不会导致语法错误, 而是将后面的语句都当成了注释内容, 没有任何错误.

执行的三条语句含义:

  1. 读取文件原文时中文显示为乱码
  2. 使用 utf-8 编码格式读取则正常显示
  3. 执行脚本则出现中文编码问题, 代码没有执行, 而且也没有任何错误

在这里插入图片描述
原本以为可以调整 Powershell 的配置来修复编码问题, 但试了很多方法发现都不行. 直接读取写入文件时用中文正常, 但是作为脚本文件执行时中文仍旧乱码.

最后只好将 test.sp1 文件的编码设置为 GBK 格式, 其他都不用设置, 这样不论读写, 还是运行脚本, 中文都可以正常识别, 看来这个 powershell 的脚本文件最好不要使用 utf-8 编码格式.

在这里插入图片描述

又再 wsl2 环境测试了下, 发现 powershell 居然不存在编码问题, 文件使用 utf-8 格式的中文, 在 wsl2 中执行脚本可以正常识别中文, 一切正常.

在这里插入图片描述
在这里插入图片描述

测试 windows 中通过 powershell 命令来创建新文件写入, 文件使用的是 unicode 编码格式

下面是一些测试过但没有啥用的方法, 仅作参考吧:

$OutputEncoding = [console]::OutputEncoding = [console]::InputEncoding = New-Object System.Text.UTF8Encoding

[System.Console]::OutputEncoding=[System.Text.Encoding]::GetEncoding(65001)

还有注册表 PageCode 之类的设置都没有效果

# 创建用户配置文件, 默认不存在该文件, 自动创建
echo $PROFILE
New-Item $PROFILE -ItemType File -Force
'$PSDefaultParameterValues["*:Encoding"] = "UTF8"' >> $PROFILE

上面这个方法也只是全局设置读取文件会自动使用 UTF-8 编码, 但执行脚本时仍然是乱码.

下面这个方法尚未测试过:
一个 beta 标注就不太敢用了, 网上搜索了下很多人开启后会遇到很多软件乱码等奇葩文字问题, 也不建议使用.

-> 设置
-> 时间和语言 
-> 语言
-> 管理语言设置
-> 非 Unicode 程序的语言
-> 更改系统区域设置
-> 勾选: Beta版 Unicode UTF-8 提供全球语言支持
-> 重启

以上是关于Powershell编码原因导致部分代码不执行的主要内容,如果未能解决你的问题,请参考以下文章

Powershell编码原因导致部分代码不执行

Powershell编码原因导致部分代码不执行

PowerShell ISE/文件名解析缺陷远程执行代码漏洞#RCE

java爬虫一段话里的部分字符乱码解决

Powershell编码命令未执行

编码规范 -- 如何应对需求变更