目次
PowerShellのスクリプトとは?
PowerShellはマイクロソフトが開発したシェル機能です。Windows10に標準で入っているので、すぐに利用出来るメリットがあります。コマンドプロンプトに似ていますが、それよりも多機能です。
Windowsは昔から拡張子が.batのバッチファイルを使用できましたが、PowerShellにも同じように.ps1拡張子のスクリプトを使うことができます。ただしこれを使うにあたって注意点があります。それを含めましてスクリプトの使い方を解説しましょう。
スクリプトを使うには管理者権限が必要
PowerShellのスクリプトを作るには、スタートメニューのWindows PowerShellフォルダにある「Windows PowerShell ISE」を使用するのが便利です。ただし初回の場合は右クリックをして、その他→管理者として実行、で起動してください。
このアプリがデバイスに変更を加えることを許可しますか?と聞いてきますが、はいを選択してください。するとWindows PowerShell ISEが起動します。
ファイルサイズの平均を出すスクリプト
まずはWindows PowerShell ISEの上部のテキスト入力欄に以下の内容を入力してください。Get-ChildItemで実行した場所のファイル数を取得し、次にGet-ChildItemとForEach-Objectを組み合わせてファイルの総サイズを計算して、割り算で1ファイルの平均サイズを表示します。-Recurseをつけているのでサブフォルダ以下も対象になります。
$cnt = (Get-ChildItem -Recurse).count
$allsize = 0
Get-ChildItem -Recurse | ForEach-Object { $allsize += $_.Length }
$average = $allsize / $cnt
Write-Host ファイルサイズの平均は $average byte です。
Read-Host Enterを押してください
スクリプトをps1形式で保存
F5を押すと実行します。なおWindows PowerShell ISEは起動するとC:\WINDOWS\system32が現在の場所になっていますが、ここで全ファイルをチェックするような処理は実行しない方が良いので、実行前に「Set-Location パス名」で別の場所に移動しましょう。
実行するとその場所のファイルサイズの平均が表示されます。それではこのスクリプトを保存しましょう。メニューのファイル→名前を付けて保存で、average.ps1という名前で保存します。
セキュリティエラーで実行できない
では保存したスクリプトを実行しましょう。Windows PowerShell ISEのコマンドラインから、
.\average.ps1
と入力してEnterを押下します。すると、以下のようなエラーが出て実行できません。
.\average.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\test\average.ps1 を読み込むことができません。
(中略)
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
Windows10は初期状態ではスクリプトを実行できない
Windows10は初期状態では、PowerShellのスクリプトを実行できないのです。その理由はPowerShellが多機能で強力なため、それだけセキュリティ的な危険もあるからです。スクリプトを実行できるようにするにはどうしたらよいのでしょうか。
その方法は、コマンドラインから以下を実行してください。
Set-ExecutionPolicy RemoteSigned
すると実行ポリシーを変更しますか?というダイアログが出てきて、はい/いいえを聞いてくるので、はいを選択してください。
実行ポリシーを変更すればスクリプトを実行できる
これでスクリプトを実行できるようになります。以下を入力すると、今度は実行できることがわかります。
.\average.ps1
Set-ExecutionPolicyで実行ポリシーを変更できたのは、Windows PowerShell ISEを管理者権限で起動しているからです。そうでない場合は変更はできません。なおSet-ExecutionPolicyで指定できる実行ポリシーは次項の4種類があります。
4種類の実行ポリシー
Restricted 全てのスクリプトを実行できない。
AllSigned 署名されているスクリプトのみが実行可能。
RemoteSigned このPCで作成したスクリプトは実行可能。インターネットでダウンロードしたスクリプトは署名がある場合のみ実行可能。
Unrestricted 署名が無くても全てのスクリプトが実行可能。
Windows10は初期状態ではRestrictedになっています。ちょうどいい実行ポリシーは、今回Set-ExecutionPolicyで選択したRemoteSignedと言えるでしょう。
マウスでスクリプトのアイコンを選択して実行も可能
スクリプトはコマンドラインからだけでなく、Windows10のエクスプローラー上からアイコンを選択して実行することもできます。エクスプローラーでps1ファイルを選択して、マウスの右クリックで「PowerShell で実行」を選択します。
するとPowerShellが立ち上がって、ps1ファイルが実行されます。処理が終了するとウィンドウはすぐ閉じてしまうので、今回のスクリプトの最後に記述しているRead-Hostで入力待ちをすると良いでしょう。
スクリプトはパラメータ指定も可能
スクリプトは$Args[0]、$Args[1]…という形式でパラメータを受け取ることもできます。今回のサンプルを以下のように直します。
$path = $Args[0]
$cnt = (Get-ChildItem $path -Recurse).count
$allsize = 0
Get-ChildItem $path -Recurse | ForEach-Object { $allsize += $_.Length }
$average = $allsize / $cnt
Write-Host $path のファイルサイズの平均は $average byte です。
Read-Host Enterを押してください
これで以下のように調べたいフォルダを指定することができます。
.\average.ps1 c:\test
Paramでパラメータを指定できる
引数を最初に宣言することもできます。サンプルソースの先頭を以下のように変更しましょう。
Param($Path)
$path = $Path
すると以下のような指定も可能になります。
.\average.ps1 -Path c:\test
パラメータは以下のように型を宣言することも可能です。
Param([String]$Path)
$path = $Path
複数のパラメータを持つこともできる
パラメータは複数持つこともできます。以下をsizecheck.ps1として保存してください。2つ目のパラメータの数値よりも大きいサイズのファイルを数えます。
Param([String]$Path,[Int]$Size)
$count = 0
Get-ChildItem $Path -Recurse | ForEach-Object {
If($_.Length -gt $Size) { $count++ }
}
Write-Host $path の $Size byteより大きいファイルは $count あります。
Read-Host Enterを押してください
以下のように実行できます。
.\sizecheck.ps1 c:\test 200
もし以下のようにした場合、2つ目のパラメータがInt型ではないのでエラーにすることができます。
.\sizecheck.ps1 c:\test abc
PowerShellのスクリプトを活用しよう!
PowerShellのスクリプトについて解説しましたが、ご理解頂けましたでしょうか。Windowsでバッチファイルを使っていた人も、今後は是非、PowerShellのスクリプトに移行しましょう。
インフラエンジニア専門の転職サイト「FEnetインフラ」
FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。
転職をお考えの方は気軽にご登録・ご相談ください。