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日
2022年11月05日
大量のフォルダの削除を自動化
ちょうど一年前(2021年)に、C:\Windows\system32\config\systemprofile\appdata\local のディレクトリに大量のtmpフォルダが保存されているという記事をみつけ、私の場合はどうかなと確認したら、記事の通り10,000に近い数のtmpフォルダが存在した。
ネットの記事を参考に、削除しても問題ないを信じて全てを削除して一年経過したが不具合は発生していない。(自身の責任・判断で)
その後どうなっているか確認すると、同じディレクトリに11,016個の「tw-*.tmp」フォルダが確認された。1年間で11,000個作られている。Windowsの使い方などにより作成される頻度は違うのだろうか。
調べると、この「tw-*.tmp」の作成を阻止する方法を記載しているサイトもある。
「タスクスケジューラ」→「Windows」→「Management」→「Provisioning」の「LOGON」を右クリックで「無効」に設定するらしい。そうすると、この事象の発生状況も確認できなくなるようなので、これまでのように削除する方法を採る事にする。
しかしバッチで作成して思い出した時に走らせるのでは、削除時間が思っているよりも長時間かかるので、何かのついでに自動化することにする。
月に4~6回実行するPowerShellがあるので、その中で走らせる構想で作成する。
PowerShellについては初心者なので、ネットで調べては、動きを確認しながら、修正しながらコーディングする。
$changefolder = "C:\windows\system32\config\systemprofile\appdata\local"
# ディレクトリ名を設定
write $changefolder
# 変更するディレクトリ名を確認
cd C:\windows\system32\config\systemprofile\appdata\local
# 作業するディレクトリを変更
$filecount = (get-childitem tw-*.tmp | ? psiscontainer).count
# そのディレクトリにある「tw-*.tmp」フォルダの数を取得
if ($filecount -eq 0) {write zero}
# フォルダ数が0であれば、そのまま終了
else {write $filecount
remove-item tw-*.tmp}
# フォルダ数が0以外であれば該当名のフォルダを削除
$host.UI.RawUI.ReadKey()
# 作業結果を確認するのにPauseさせる
コーディング最中にも、該当ディレクトリの中に該当するフォルダは削除した後だったので、削除するフォルダ名に似たフォルダを作成しておいて、削除できるのかを確認しながらテストした。
このコーディングを先程のPowerShellファイルに組み込めば、月に数回は削除するタイミングが発生するので、年間11,000個も残ることは無いだろう。
投稿者 owner : 2022年11月05日