そろそろ低機能なDOSバッチファイルから卒業したい、ということでPowerShellを触ってみました。
Windows10に標準搭載なので環境は問題無いです。
今回の課題は「"Hello World" を表示する」です。すべてのプログラム言語における最初の一歩です。
しかしこれが思いの外難航しました。
その1,まずはスクリプトファイルを作ろう
メモ帳を開いて以下のコードを書き込み、ファイル名 "test.ps1" で実験用の適当なフォルダに保存します。
ここまでは問題ありません。
さあ、これを実行したいのですが、PowerShellはあの手この手で実行を妨害してきます。挫折しかけます。
その2,ダブクリックで実行しようとして挫折する
.exeや.batならダブルクリック実行余裕なのですが、PowerShellはそうは問屋がおろしません。
最初、コンテキストメニューに「PowerShellで実行する」といったメニューがあった気がしますが、一度テキストエディタで開いてからそれすらも表示されなくなり、ダブルクリックではそのエディタが立ち上がるようになってしまいました。
ならばと既定のアプリ設定で .ps1 拡張子ファイルでPowerShellが立ち上がるようにしようとしたのですが、PowerShellは選択できませんでした。
調べてみたところ、レジストリを触る必要がありそうな気配。
てことで、ダブルクリック実行は諦め、PowerShellのコンソールを開いてそこから実行することにします。
特定のフォルダでPowerShellコンソールを開く方法ですが、エクスプローラーでそのフォルダに移動し、アドレスバーに "powershell" と入力してEnterキーを押せば開きます。ちなみに "cmd" でDOS窓が開きます。
さて、実行だ!
その3,test.p1 を実行しようとして失敗する
test.ps1 のあるフォルダでPowerShellコンソールを開き、スクリプトファイル名を入力して実行しようとします。
PS E:\Work\Labo> test.ps1
test.ps1 : 用語 'test.ps1' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ test.ps1
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (test.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
実行に失敗します。カレントフォルダに検索パスが通ってないのが原因です。このあたりはUNIXと同じですね。てことで以下のようにします。
PS E:\Work\Labo> .\test.ps1
ですが、まだ動きません。ははは、こやつめ。
その4,セキュリティーに阻まれる
実行できずにエラーが表示されます。
PS E:\Work\Labo> .\test.ps1
.\test.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル E:\Work\Labo\test.ps1 を読み込むことができません。
詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\test.ps1
+ ~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PowerShellはセキュアですがその分気軽に使えなくなっています。
セキュリティーポリシーを変更する必要があります。Set-ExecutionPolicyコマンドでインターネット経由でダウンロードしたスクリプトのみ証明書を要求するように変えましょう。
長いコマンドですが、途中まで入力してTabキーを押すと補完してくれるので便利です。
PS E:\Work\Labo> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y
ででーん
Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
' へのアクセスが拒否されました。 既定 (LocalMachine) のスコープの実行ポリシーを変更するには、[管理者として実行]
オプションを使用して Windows PowerShell を起動してください。現在のユーザーの実行ポリシーを変更するには、"Set-ExecutionPolicy
-Scope CurrentUser" を実行してください。
発生場所 行:1 文字:1
+ Set-ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
まだだ、まだ終わらんよ
その5,管理者権限が必要だよね
セキュリティー関係を触るのですから一般ユーザでは変更できませんね、はい。
ということで管理者権限でPowerShellコンソールを立ち上げます。
コルタナさんにpowershellを問い合わせると「Windows PowerShell」が候補に出てくるので、右クリックして「管理者として実行」してください。で、先ほどと同じコマンドを入力します。今度は成功するはずです。
エラーなく終了したらこの管理者コンソールは閉じてしまいましょう。
その6,Hello World
元のコンソールに戻って実行してみます。
PS E:\Work\Labo> .\test.ps1
Hello world
ようやく成功!
長かったよ、お疲れ様!