2022年11月29日
PowerShellスクリプトの文字コード
過去のPowerShellスクリプトの実行はV7をインストールしていたものの、強く意識していなかったのでディフォルト状態で動かしていた。しかしスクリプトの最初に
$psversiontable
を挿入して起動する時にバージョンを確認したら、V5.1だったので、V7をインストールしておいた意味がない。
今回、新しく作成したPowerShellスクリプトはV.7で動かそうと思い、スクリプトのショートカットのリンク先に、次の内容を記述した。
"C:\Program Files\PowerShell\7\pwsh.exe" D:\実行するPWSHスクリプト名 -Executionpolicy RemoteSigned -file
このパラメータを後ろに記述するのも試行錯誤で、PWSHのコマンドレットでも後方に記述しなければ機能しなかった経験もあったので、それを採用したら機能するようになった。
これでPWSHがV.7で動くようになったが、カタカナフォルダ名が中にあると文字化けが発生し、スクリプトがエラーで停止する。
GoogleDriveをインストールしていて、その先にバックアップを保存しようとしているのだが、GoogleDriveは仮想ドライブを作成して、その先にカタカナの「マイドライブ」フォルダが存在する。そこを指定しようとしているのだが、この「マイドライブ」が文字化けしてしまう。
PowerShell V5.1では問題なく動作するが、V7ではフォルダ名が見つけられなくてエラーで停止する。
PWSHのインストール時の設定に何かあったのだろうか。ネットで調べても調べきれない。
Windowsの地域設定の中のチェックボックスをONにすればとのネットの調べでONにしてみたら、途端に他のアプリに影響が出たので戻した。
GoogleDriveの「マイドライブ」の名を英文字に変更できないかも調べたが、記述も見つけられなかったし、私の知識では出来ないような気がする。
「マイドライブ」を英文字の仮想ドライブにしてそれを指定したらどうか、検討してみたが良い解決法でもないような気がする。カタカナ・日本語フォルダ名が出てくる度に仮想ドライブを作っていたらALPHABETが足りなくなる。
文字コードについて調べていく内に、スクリプトの文字コード自体はなにで保存されているのか、一般的にスクリプトなどはどの文字コードで作成・保存しているのかを確認。
PWSH V7を起動して、 $OutputEncoding.EncodingName で調べると Unicode(UTF-8) と返答。
PowerShell V5を起動して、 $OutputEncoding.EncodingName で調べると US-ASCII と返答。
スクリプトを作成する時にはTeraPadを利用しているが、保存する時にはテキストファイルなのであまり気にせずディフォルトで保存していた。
V5で正常稼働するスクリプト、V7で文字化けエラーが発生するスクリプトの文字コードを確認すると両方とも「SHIFT-JIS」で保存されていた。
V7で文字化けエラーが発生するスクリプトをTeraPadで保存する時に「UTF-8」を指定。
すると、V7で実行時に文字化けエラーが発生していたスクリプトが、悩みなどないようにあっさりと実行された。
そうだったのか。スクリプト実行時に解釈する文字コードが違っていたので、V5とV7ではスクリプトの文字コードの保存状態によりエラーが発生したり、しなかったりしたようだ。
スクリプト自体の文字コードだとは気がつくのが遅かった。
これから私の環境では、別の要因のトラブルが発生するまでは、PWSHのスクリプトを作成して、そのスクリプトを保存する時には「UTF-8」を指定すれば、日本語を含むフォルダなどがあっても悩むことなくPWSHを実行できるし、V5とV7もサイド・バイ・サイドで実行できる。
この環境を手に入れるために、この問題を悩んだと思って良しとしよう。
投稿者 owner : 2022年11月29日