powershell虽然也会有一些问题,但是相比bat功能更加丰富,尤其写一些比较复杂的功能用powershell比bat简单了不是一星半点儿。bat现在的优势是入门简单,然后就是用的人比较多,很多项目的windows端脚本(例如项目启动脚本)基本都是bat。

   本篇着重介绍在编写powershell脚本时会遇到的各种问题,会持续更新。

命名问题

  • powershell的文件路径中不能含有特殊符号,例如编写一个脚本另存为test(1).ps1,运行就会直接闪退,需要把英文括号改成中文,或者直接删除才可正常运行。
  • powershell的函数命名可以包含“-”符号,变量命名可以包含“_”符号,如果搞混了运行就会直接闪退。
  • powershell里面有各种保留关键字,例如input,如果把变量或者函数命名成这样,运行就会直接闪退。

编码问题

  • powershell的脚本编码必须是“UTF-8 BOM”,如果使用UTF-8遇到中文会遇到解码问题,脚本运行出错。
  • powershell的代码页(就是黑色的命令行界面)默认编码是ANSI,调用第三方exe很容易出现中文乱码,需要把代码页也更改成UTF-8编码。powershell更改代码页为UTF-8编码:“chcp 65001 > $null”。

代码问题

  • 代码:

    $a = 1
    Write-Host $a + 1
    pause

    运行结果:

  • 代码:

    $a = 1
    Write-Host $($a + 1)
    pause

    运行结果:

  • 代码:

    $a = 1
    $b = $a + 1
    Write-Host $b
    pause

    运行结果:

  • 代码:

    $a = 1
    Write-Host "$a是一个数字"
    pause

    运行结果:
    此时“a是一个数字”整体被当成了变量名,因为没有此变量,所以仅输出一个换行符。

  • 代码:

    $a = 1
    Write-Host "$a 是一个数字"
    pause

    运行结果:
    此时空格分隔出了变量a,所以能正常识别变量名。

  • 代码:

    $a = 1
    Write-Host "$($a)是一个数字"
    pause

    运行结果:
    此时“$()”划分出了变量a,所以能正常识别变量名。

管道符问题

  • powershell的管道符仅支持字符流,不支持传递二进制数据。如果需要传递二进制数据则需使用“cmd /c”。

调试问题

  • powershell遇到代码语法性质的问题会直接闪退,如果语法错误在关键字“pause”之后,仍然会直接闪退,并不是按Enter继续运行才闪退。

   各位如果觉得有用请点击下方的打赏,扫描二维码给我投币,创作不易,感谢支持!