はじめに
先日、初めてPower Shellを使ってファイルのバックアップ処理を作る機会があったのですが、
そのときにハマってしまった罠、解決策についてまとめておきたいと思います。
使用したツール
- Power Shell
- Visual Studio Code
Power Shellを使ったきっかけ
Windows ServerでネットワークポリシーサーバのNPSテンプレートを
定期的にエクスポート、バックアップを取るためにどう自動化するか…
というところから始まりました。
調べてみると、Power Shellでエクスポートすることが可能ということが
わかったので、Power Shellで処理を作成することにしました。
Export-NpsConfiguration -Path c:\config.xml
罠にハマるまでの作成手順
Power Shellを作成した際の手順を記載します。
- Power Shellを起動
- NPSのエクスポートコマンドを直接入力して動作確認
- Visual Studio Codeでps1ファイルを作成(メインの処理+ログ出力処理など)
- Visual Studio Codeで作成したコードをコピーし、Power Shellにペーストして動作確認
- ps1ファイルを実行
1.~4.までTry and Errorを繰り返して作りたい処理を作成、動作確認まで完了しました。
しかし、5.のps1ファイルで実行すると実行は終わったように見えるのに、
処理後の確認をしてみると全く動いた形跡がない。
NPSのエクスポートファイルは作成されていないし、
ログ出力もされていない…
何より、動いていないならエラーが出てもよいはずなのにエラーも出ない…
原因
"Power Shell 動かない"、"Power Shell 実行できない"といったワードで検索すると、
一番ヒットするのは、ps1を実行する際に必要なポリシーの設定でした。
powershell -ExecutionPolicy Unrestricted .\hogepiyo.ps1
でも、上記はできているのでそれでも動かないのは謎でした。
さらに調べていくと、やっと原因がわかりました。
Visual Studio Codeでps1作成していた時の文字コードが、
「UTF-8」
だったことが原因でした。
実は、Power Shellのコードを書くことに必死になっていて
コード内のコメントを普通に日本語で書いていました。
(作成途中でコードをコピーして実行したときには
日本語のコメントも問題なく読み込み、動作していたので
問題ないんだなと無意識にそのまま進めてしまいました。)
解決策
コメントは1バイト文字で書くのが常識と言われたらそれまでですが、
Power Shell内で2バイト文字の名前が付いたファイルを扱う
ケースもあるかもしれません。
そんなときに2バイト文字が使えないのは困ります。
その場合の解決策は、文字コードを以下に切り替えることです。
- SHIFT-JIS(CP932)→OSのロケール設定に依存するので、日本語環境であれば〇
- UTF-8 BOM付
- UTF-16 BOM付
さいごに
2バイト文字は使用しないほうが良いとわかってはいましたが、
コードをPower Shellにコピーして実行したときは
普通に実行できていたのでps1ファイルで動作させても
同じ挙動をしてくれると思い込んでいました。
ps1ファイルでの動作確認をしたことで
今回この問題にぶち当たりました。
同じような壁に当たった方の参考になれば幸いです。