PowerShell脚本编写踩坑记

最近由于业务需要,想写个 PowerShell 脚本来实现数据库的一些批量操作,其实用 Python 实现起来是很简单的事,但不想在生产环境安装 Python 了,由于服务器是 Windows Server,想用 PowerShell 来实现试试,正好顺便体验一下号称宇宙最强的 Shell 到底是不是浪得虚名。

初期进行了一些相关的试验,基本上一切顺利,确保各种功能都可以实现,比如读写MySQL、调用.NET类库,感觉一切都没问题了,就正式制作了一个完整的生产脚本。

谁知道在最终测试的时候总是不行,问题总是出在一句读取数据的脚本上,这条语句要一次读出几万条数据,总是不读取,怀疑是由于读取的慢,被 PowerShell 的异步机制给忽略了,然后开始各种研究、各种折腾。尝试了 Start-Job -ScriptBlock 然后 Wait-Job / Receive-Job -Wait 都不行,而且在折腾 Job 模式的时候还发现,在 Job 代码块中没法调用全局代码中定义的函数和变量,好像这个代码块是一个新的独立进程一样,这个代码块里的变量什么的都要单独声明。

折腾了半下午,最后发现之前测试时能读取到数据的代码,在这个生产脚本中也不能读取到数据了,感觉有点灵异!最后经过逐步排查,最终发现问题竟然出在注释上!这简直太不可思议了!经过反复测试,发现只有某行注释中有“的记录”三个汉字,这行注释下面的一行自动失效,貌似也被注释掉了!例如:

$xx = "123"
# XXX的记录
$xx = "abc"

Write-Host $xx
# 这里输出的是 123
$xx = "123"
# XXX的记录

$xx = "abc"

Write-Host $xx
# 这里输出的是 abc


发现这个情况之后,在这行注释之后多空了一行,生产脚本工作起来就一切正常了!

 

PS. 第二天才发现,其实并不是 PowerShell 的 BUG,相信微软也不会出现这么低级的 BUG,其实是由于 PowerShell 的窗口环境对 UTF-8 的支持不好,而用 VSCode 创建的 PowerShell 脚本默认又是 UTF-8 格式,所以在执行脚本的时候,实际上是“的记录”这三个汉字产生了乱码,怀疑是乱码存在 BACKSPACE 或 DEL 符,导致把接下来的一行也拉到了和注释相同的一行。最终把脚本的编码改为GBK,一切问题都不存在了!

  

 

posted @ 2022-06-04 21:03  润之  阅读(132)  评论(0编辑  收藏  举报