PowerShellを触ろう

仕事で必要になったので。
PowerShellを書くとか、バッチファイルを書くこともロクにやったことがないので、すごい基本的なところからのお勉強です。
とりあえず、echo hello worldを実行するだけのプログラムを書きます。このぐらいなら、何とか分かるが…

通常はPowershellはファイルをクリックで実行できない

Powershellはps1ファイルから実行できるが、デフォルトのままだとps1ファイルを叩いても動作しない。
そこで、ファイルクリックからスクリプトを実行できるようにするために、実行ポリシーの変更が必要になる。

PS C:\Users\bladecatcher> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシー
を変更すると、about_Execution_Policies のヘルプ
トピックで説明されているセキュリティ上の危険にさらされる可能性があります。実行
ポリシーを変更しますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): y
Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Po
werShell\1\ShellIds\Microsoft.PowerShell' へのアクセスが拒否されました。
発生場所 行:1 文字:20

  1. Set-ExecutionPolicy <<<< RemoteSigned

+ CategoryInfo : NotSpecified: (:) [Set-ExecutionPolicy]、Unauthor
izedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.Pow
erShell.Commands.SetExecutionPolicyCommand

原因は、Powershellを管理者権限で実行していなかったため。
Powershellを管理者権限で開き直して再度実行したら、上手くいきました(上手くいくと特にメッセージ無くプロンプトが帰ってくる)
ちなみに、調べたところこのページと全く同じ事象だった。
全く同じ状況について記載している記事を見つけると安心する。
https://bayashita.com/p/entry/show/35

pause的なことをさせたい

ほんで、Powershellのウインドウから実行、もしくはps1ファイル上で右クリックでスクリプトを実行可能になったはいいが、処理が終了するとすぐにウインドウが閉じてしまうので、実行結果を確認するために、ウインドウを閉じないようにしたい。
バッチファイルの場合は、pauseと記述すればいいようだ。

PS C:\Users\bladecatcher> C:\Users\bladecatcher\Desktop\TestScript.ps1
Hello world
用語 'pause' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名
が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認して
発生場所 C:\Users\bladecatcher\Desktop\TestScript.ps1:3 文字:6

  1. pause <<<<

+ CategoryInfo : ObjectNotFound: (pause:String) []、CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

echoは問題なく実行できた。
しかしpauseはできない。Powershellでは対応していないんだろうか。

どうやらPowershellで、処理完了後にウインドウが閉じられないようにするには、-NoExitオプションを追加して実行すればいいらしい。

PS C:\Users\bladecatcher> Powershell -NoExit -File C:\Users\bladecatcher\Desktop\TestScript.ps1
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

Hello world
PS C:\Users\bladecatcher>

できた。
が、実行時にわざわざオプションを指定するのはめんどくさい(そもそも今後本番で作るスクリプトPowershellのウインドウから実行させるのかも分からんし)
さらに調べたところ、Read-Hostコマンドレットによって止めることもできるようだ。

Read-Host "続けるには Enter キーを押してください..."

という記述を一番下の行に下に加えたら、「続けるには Enter キーを押してください...」というメッセージを表示させながら止めることができました。
参考:http://neos21.hatenablog.com/entry/2017/01/12/014803
このやり方だと、今後支障が出る可能性があるやもだけど、めんどくさいのでとりあえず超お手軽バージョンでやってみることとする。