某PCショップ店員の覚書

勤務中に作成したプログラムやスクリプトのまとめ

VS Codeで作った.ps1スクリプトがPowerShell ISEで開くと文字化けしたり、そもそも実行できない件

今までPowerShellスクリプトを組む際はPowerShell ISEを使ってコーディングしていましたが普段他の言語でコーディングする際はVS Codeを使っているのでPowerShellもそちらに乗り換えました。
ただ、PowerShell ISEを使って作成したスクリプトは何の問題もなく実行できますが、VS Codeで作成したスクリプトは何故か実行してもコンソールが一瞬で閉じてしまう現象に襲われていました。
色々調べた結果、PowerShell ISEはShift-JISでスクリプトが保存されるのに対し、VS CodeUTF-8のBOM無しで保存されてしまうのが原因でした。

別に「"」で囲まれた文字列が文字化けするだけなら大きな問題ではないんですが、「"」が文字化けしてしまうと大変なことになります。
こんな感じ↓ (いつぞや解説したAuto Gaming Setterのスクリプト)

###########################################################################
# VC Runtime縺ョ繧、繝ウ繧ケ繝医・繝ォ
###########################################################################
$TotalProgress = 7
$denominator = "/"+[string]$TotalProgress
Write-Host "-----------------------------------------------------------------"
Write-Host "Process " -NoNewline ; Write-Host "1" -NoNewline -ForegroundColor Red ; Write-Host "/" -NoNewline ; Write-Host "5" -ForegroundColor Green
Write-Host "VC Runtime縺ョ繧、繝ウ繧ケ繝医・繝ォ" -ForegroundColor Green

Write-Host "VC Runtime 2005 - 2019縺セ縺ァ縺ョ繧ゅ・繧偵う繝ウ繧ケ繝医・繝ォ縺励∪縺吶・

Write-Host "2005..."
Start-Process -Wait -FilePath "$ScriptDir\Data\VC_Runtimes\vcredist2005_x86.exe" /q
Start-Process -Wait -FilePath "$ScriptDir\Data\VC_Runtimes\vcredist2005_x64.exe" /q

見てわかる通り、「Write-Host "VC Runtime 2005 - 2019縺セ縺ァ縺ョ繧ゅ・繧偵う繝ウ繧ケ繝医・繝ォ縺励∪縺吶・」が文字化けしてしまっている所為でWrite-Host以下の処理も文字列として扱われてしまっています。
これを解決するためにはVS Code側でShift-JISとして保存するか、BOM有りのUTF-8として保存する必要があります。

VS Code ウィンドウ下部にある「UTF-8」をクリック

エンコード付きで保存」をクリック

UTF-8 with BOM」をクリック

以上です。

......そもそもPowerShell本体がShift-JISじゃなくてUTF-8 BOM有り無しに対応してくれればこんなことにはならないんですけどね。