fastapple's blog

時系列関係なく、情報を追記・分割・統合などします。ブログに記載の内容のうち、引用ではなく、私自身が記載している文章・コードなどについては、自由にご利用ください。

Powershellの最初の設定


2016/4/20 加筆変更

Windows10が登場したので、更新することにした。Windows10で利用されているpowershell5.0を前提に書きたい。
バージョンを確認したいなら、psversiontableの内容を確認すればよい。

echo $psversiontable


まず、管理者権限でpowershellを起動し、以下を実行する。

PS C:\WINDOWS\system32> Get-ExecutionPolicy
Restricted

最初の設定では、スクリプトファイルが読み込めない設定(Restricted)となっている。

これを、ローカル以外のスクリプトのみ、証明書が必要な設定(RemoteSigned)に変更する。大抵はこの設定が必要十分なはずだ。
なお、今回は、管理者権限で、一気に権限を与えているが、複数ユーザーを細かく制御したい場合、方法は変わってくるだろう。(権限をユーザーごとに設定することもできる)

PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned

Windows8までは、実行ポリシーの変更のときに、追加で色々質問が出てきたが、10になってから、特に何も表示されず、すぐ変更されるようになった。(厳密に10からなのかは不明)

もう一度、権限を確かめてみると、RemoteSignedになっていればOK。

PS C:\WINDOWS\system32>Get-ExecutionPolicy
RemoteSigned

ここで、一度管理者権限で入ったPowershellを抜けて、利用しているユーザーでpowershellを起動する。
まず、プロファイルを設定する。プロファイルは、ユーザーごとに設定でき、コンソールの起動時に読み込まれる。
更に、powershellのコマンドを起動した場合と、powershell_iseを起動した場合で、読み込まれるプロファイルが違ってくるのだが、共通で読み込まれるものもある。

大抵の場合は、共通で読み込まれるものをユーザーごとに用意しておけば事足りるだろう。

おもむろに下記を実行すると、環境変数の一覧が表示される。

ls env:

すると、USERPROFILEの値が、C:\Users\<ユーザー名>のような、割りと便利な値になっている。

で、echo $profileとすると、通常は、<上記パス>\Microsoft.PowerShell_profile.ps1などのユーザーごとでさらにコンソールの種類ごとのものが設定されているのだが、今回これはあまり使う気がないので、似たような名前として$_profileという変数を用意してやって、それをProfile.ps1に割り当ててしまおう。

$_profile = $env:userprofile + "\Documents\WindowsPowerShell\Profile.ps1"
$_profileDir = $env:userprofile + "\Documents\WindowsPowerShell"
#PSModulePathに記載されているディレクトリの一つを掘る。
mkdir -Force ( $_profileDir + "\Modules" )
#自動読み込み用のディレクトリを掘る。
mkdir -Force ( $_profileDir + "\autoload" )

さて、そうしたら、Profile.ps1の中身を編集していく。もともとProfile.ps1をどこかに用意していれば、他環境でもそれをなるべく流用できるような形で使いたい。とりあえずメモ帳で開こう。

notepad $_profile

内容は下記のような感じ。$_profileと、$_profileDirを定義して、あとは、さっき作ったautoloadディレクトリの中のps1ファイルを全部読み込むようにする。下記有名サイトの方法などを参考にしている。(ちょっと端折った)

参考:
PowerShell で Profile を利用して スクリプトの自動読み込みをしてみよう - tech.guitarrapc.cóm
あとこことかも
Enhance your PowerShell experience by automatically loading scripts

$_profile = $env:userprofile + "\Documents\WindowsPowerShell\Profile.ps1"
$_profileDir = $env:userprofile + "\Documents\WindowsPowerShell"

#PSModulePathに記載されているディレクトリの一つを掘る。
mkdir -Force ( $_profileDir + "\Modules" ) >$null
#自動読み込み用のディレクトリを掘る。
mkdir -Force ( $_profileDir + "\autoload" ) >$null

Get-ChildItem "$_profileDir\autoload\*.ps1" | %{.$_}

echo "autoload complete!"

一度 ドットソースで読み込んでおく。

. $_profile

さて、あまり$_profileそのものを弄りたくはないので、ここからはautoloadの方をいじることにする。

まずロギングをしたい。しかも最初の方で呼ばれてほしいので、0_logging.ps1というのをつくる。

cd $_profileDir\autoload
notepad 0_logging.ps1

ログを書き出すディレクトリはここでは、D:\log\powershell\<今日の日付>.logとしよう。
そして、先ほどのファイルに、以下の内容を記載する。

$today = Get-Date -format yyyyMMdd
Get-Date
Start-Transcript -path "D:\log\powershell\$today.log" -append

これで、powershellの起動と同時に実行ログを書いてくれる。シェルを閉じるとき、Stop-Transcriptとしてから、exitとするようにするのがいい。(まあ別にそのまま閉じても問題ないが、ログの見易さの問題。)

またあとでもう少し書き足すかも。