今回の内容はすごくニッチかもしれませんが・・・
自分の環境で解決するのにすごく悩んだので、備忘録しておきます。
ここで説明する概要
PowerShell 起動時に、自動で指定したコマンドを実行させたいときがあります。
それを解決する方法として、Microsoft.PowerShell_profile.ps1
というPowerShellが起動時に読み込みするファイルに、任意のコマンドを追記して実行させるという方法が一般的みたいです。
Microsoft.PowerShell_profile.ps1
の場所(パス)は、PowerShell では $profile
という変数に格納されています。
ここでは、$profile
に格納されている Microsoft.PowerShell_profile.ps1
が 使用できない という想定で、他で代替する方法について記載します。
具体的には、ターミナルの設定をいじるという、ゴリゴリのチカラ技になります。
経緯
そもそも、Microsoft.PowerShell_profile.ps1
のファイル内の記述を変更/追記したりすることはよくあると思いますが、Microsoft.PowerShell_profile.ps1
のパス自体を変更したいというシチュエーションはあまりないかと思います。
今回自分がそれに迫られた理由は、端的に言うと「会社支給PCの仕様のせい」です。
もうちょっと詳しく言うと、会社方針でPC内の特定のフォルダが「AIP(Azure Information Protection)」の適用を受けており、対象のフォルダ内のファイルが全て暗号化されます。
一応暗号化されていても、Windowsのエクスプローラー上でダブルクリックでファイルを開くと、そのタイミングでファイルが解凍されるので、実運用上はあまり問題はないです。
ただし、やっかいなのが、暗号化されたファイルは拡張子が「.pfile
」となってしまいます。つまり、ファイル名が変わってしまうのです。
ファイル名が変わると、もちろんそのパスを参照しているものからすると参照が切れてしまいます。
Microsoft.PowerShell_profile.ps1
は、いわゆる「ドキュメント」というフォルダの配下に存在します。
自分の環境では「ドキュメント」が AIP の適用対象となっています。
結果、自分の環境では Microsoft.PowerShell_profile.ps1
が、勝手にファイル名が Microsoft.PowerShell_profile.ps1.pfile
となってしまったことにより、PowerShell が $profile
で参照できなくなってしまっていました。
じゃあ $profile
の値を変えればいいじゃないかという話になりますが、こちら set $profile=hoge
みたいな感じで変更できますが、次回ターミナル起動時には値が戻ってしまいます。
なので値を変えることで解決は難しそうでした・・・
ということで、$profile
以外で、起動時に指定したコマンドを実行さセル方法が必要になったということです。
対処方法
前置き長くなりましたが、以下対処方法です。
ここで、もともと「コマンドライン」には %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
と記載されているのですが、
以下のようにします。
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit -Command "chcp 65001; del alias:curl"
各種説明
-NoExit
はおまじないみたいなものです。これを入れないと後述の Command が実行されるとターミナルが閉じてしまうので、ターミナルが閉じないように指定しています。-Command
以下が、起動時に実行するコマンドになります。ここでは、
*chcp 65001
により、起動時に文字コードを UTF-8 に変更するようにしています。(デフォルトでは Shift-jis)del alias:curl
は、こちらはよくわからないのですが、なぜかcurl
実行時にエイリアスされたInvoke-WebRequest
が呼び出されてしまうことがあり(不定期?何がきっかけか不明?)とりあえずおまじない的にエイリアスを消しています。
以上で最後に保存をすると、次回起動時から指定したコマンドを実行してからPowershellが開くようになります。
コメント