Loading AI tools
ウィキペディアから
PowerShell(パワーシェル)は、マイクロソフトが開発した拡張可能なコマンドラインインターフェイス (CLI) シェルおよびスクリプト言語である。オブジェクト指向に基づいて設計されており、.NET Framework (Windows PowerShell 5系以前) あるいは.NET Core (PowerShell Core 6系以降) を基盤としている。
![]() |
![]() PowerShellのロゴ | |
パラダイム |
命令型プログラミング、オブジェクト指向プログラミング、関数型プログラミング、リフレクション、手続き型プログラミング ![]() |
---|---|
登場時期 | 2006年11月14日 |
設計者 | Jeffrey Snover、Bruce Payette、James Truher、他 |
開発者 |
マイクロソフト ![]() |
最新リリース | 7.4.4 / 2024年7月23日[1] |
型付け | 強い型付け、型推論、動的型付け |
影響を受けた言語 |
Perl、Control Language、Python、KornShell、C Sharp、DIGITALコマンド言語、SQL、Tcl、Tk、Chef (ソフトウェア)、Puppet、Bash、Puppet ![]() |
プラットフォーム |
Microsoft Windows、Windows Server、Ubuntu、Debian、CentOS、Red Hat Enterprise Linux、openSUSE、Fedora、Arch Linux、macOS ![]() |
ライセンス | MIT License(Windowsコンポーネントはプロプライエタリ) |
ウェブサイト | |
拡張子 |
.ps1 , .psm1 |
Windows PowerShell Microsoft Windows コンポーネント | |
---|---|
詳細 | |
種別 | コマンドライン シェル |
標準提供 | |
追加提供 | |
関連コンポーネント | |
cmd.exe |
かつてはMicrosoft Shell(MSH、コードネーム Monad[2])と呼ばれていた。
Windows 7以降のオペレーティングシステム (OS) には標準で搭載されている。
マイクロソフトによるOSにはMS-DOSからWindowsに至るまで、どのバージョンにもコマンドラインシェルが付属した。それは、かつてはCOMMAND.COM
であり、Microsoft Windows NTベースの製品においてはcmd.exe
であった。これらのツールはグラフィカルユーザインタフェース (GUI) で提供されるような管理機能の自動化や再利用に必ずしも長けているとは言えなかった[3]。これはコマンドライン内の制限によるものであり、マイクロソフトが高品質なコマンドラインツールを提供しなかったためでもあった[4]。
マイクロソフトはコマンドラインツールの短所を補うものとして、1998年にWindows 98でWindows Script Host (WSH) を提供した。これは様々なスクリプト言語を実装するための新しいソフトウェアであった。しかしWSHはシェルに統合されていないという欠点があり、ドキュメントも非常に使いにくいものだった。またWSHの持つセキュリティ上の欠陥をつくコンピュータウイルスがいくつか出現したため、システム上の脆弱性とみなされたこともあり、広く普及するには至らなかった。
そして2003年、マイクロソフトはWindowsや自社製品のシステム管理・自動化を行うための新世代シェルとして、またスクリプトとして実行可能なプログラミング言語としてMonad(後の PowerShell)を発表した。
2015年9月現在、Windows PowerShellの正式な最新バージョンは5.0であり、Windows 10に標準搭載されている[5]。Windows 8.1に標準搭載されているバージョンは4.0、Windows 8に標準搭載されているバージョンは3.0、Windows 7に標準搭載されているバージョンは2.0となる[6]。
2016年8月には、PowerShellのオープンソース化、並びにLinuxとOS Xへの移植が発表された。これは同年6月にリリースされたオープンソースの.NET Coreに続くものとなった[7]。
2003年9月、コードネーム Monadが公開された。2006年4月、正式名称がWindows PowerShellとなることが発表され、リリース候補 (RC) 1がリリースされた。2006年9月、RC2リリース。
2006年11月、Windows PowerShell 1.0がウェブ上でリリースされた (RTW)。動作には .NET Framework 2.0を必要とする。2007年1月、PowerShell 1.0 for Vistaがリリースされた。
マイクロソフトはこれからの主なGUIツールはPowerShell上に構築されると表明し、主な管理機能がスクリプト可能になるとした。例えば、Exchange Server 2007の管理ツールはPowerShellの上に構築されている。多くの日常的な場面でPowerShellはcmd.exe
やWSHを置き換えるものとして利用できる。
2009年10月リリース。
2012年9月リリース。動作には.NET Framework 4を必要とする。
2013年10月リリース。動作には.NET Framework 4.5を必要とする。
2016年8月リリース。Windows 10 Anniversary Update及びWindows Server 2016の標準バージョン。
Windows PowerShell 5.1はDesktopとCoreの2つのエディションを提供する[注釈 2]。Desktop Editionは従来どおりのWindows PowerShellで、Core EditionはNano Serverで実行するために、.NET Core上に構築され、いくつかの機能が削減されている[12]。
項目 | 1.0 | 2.0 | 3.0 | 4.0 | 5.0 |
---|---|---|---|---|---|
Windows Server 2003 | ○SP1 | ○SP2 | × | × | × |
Windows Server 2003 R2 | ○SP1 | ○SP2 | × | × | × |
Windows Server 2008 | ○SP1 | ○SP1 | ○SP2 | × | × |
Windows Server 2008 R2 | → | ◎ | ○SP1 | ○SP1 | ○SP1 |
Windows Server 2012 | → | → | ◎ | ○ | ○ |
Windows Server 2012 R2 | → | → | → | ◎ | ○ |
Windows XP x64 | ○SP1 | ○SP2 | × | × | × |
Windows XP | ○SP2 | ○SP3 | × | × | × |
Windows Vista | ○ | ○SP1 | × | × | × |
Windows 7 | → | ◎ | ○SP1 | ○SP1 | ○SP1 |
Windows 8 | → | → | ◎ | × | × |
Windows 8.1 | → | → | → | ◎ | ○ |
Windows 10 | → | → | → | → | ◎ |
Windows 11 | → | → | → | → | ◎ |
「◎」標準搭載、「○」インストールして利用可能、「→」上位バージョン標準搭載、「×」利用不可
2016年8月、オープンソース化、Linux/OS Xへの移植を発表[7]。
2018年1月、PowerShell Core 6.0リリース[13][11]。ランタイムとして.NET Frameworkに代わり.NET Core 2.0を使用する。これによりPowerShell Core6はWindows、macOS、Linuxで動作が可能になった[14]。
2018年9月、PowerShell Core 6.1リリース[15]。 Windows 10およびWindows Server 2019との互換性強化、サポートプラットフォームの強化[15]が図られている。.NET Core 2.1を使用する。
2020年11月、PowerShell 7.1リリース[20]。.NET 5.0を使用する。
PowerShellはオブジェクト指向言語であり[21]、基本的な機能をもつ様々なコンポーネントを組み合わせたタスクによって構成される。[注釈 3]コンポーネントは、コマンドレット (cmdlet) と呼ばれるプログラムであり、その実体は.NETのクラスである[22]。
コマンドレット間でのデータの受け渡しは、古典的なUNIX型アプローチ(テキスト入出力をパイプする)とは異なり、オブジェクト(構造化されたデータ)で行なわれる。コマンドラインから個別にアクセスされた場合、コマンドレットの出力は自動的にテキストに変換されるが、出力が他のコマンドレットに渡されるのであれば、そのコマンドレットの入力として最も適切な形式に変換され、渡される[23]。これにより、UNIX型システムで一般的なテキスト処理ユーティリティ(grepやawkなど)が不要となり、インタラクティブに、またはスクリプト環境(より複雑なプログラミング言語が必要)の中で、様々なコマンドレットを結合することができる。例えば、プロセスの一覧を出力する場合、それらは単なるテキストの一覧ではなく、プロセスの情報を表すオブジェクトの一覧である。従ってそれらのオブジェクトに対して、明示的に外部の構造やライブラリを使用することなく、直接的にメソッドを適用することができる。
Windows PowerShell/PowerShell Coreには次の機能が含まれる。
powershell.exe
、PowerShell Core の場合 pwsh.exe
である[27][28]。switch
文、配列のスライシング、匿名メソッドなどの機能。ループ構文 (for
、foreach
、while
)、条件文 (if
、switch
)、変数のスコープ (global
、script
、local
)、関数の定義などがサポートされる[29]。-WhatIf
、-Confirm
オプションをサポートする。-WhatIf
は何が起こるかをユーザに通知するが、実際には何も行わない[30]。-Confirm
は何が起こるのかユーザに通知し、実行するかどうか確認を求める[31]。dir HKLM:SOFTWARE\Microsoft
-show-detailed-information
オプションは他に「s
」で始まるオプションがなければ-s
と指定することができる。cmd.exe
はファイル名やディレクトリ名しか補完できなかった。$null
が、1個の場合はオブジェクトが、2個以上の場合はオブジェクトの配列を返す。明示的に配列を返したい場合は "@()"
で文をくくる[40]。この考慮が洩れると次の例のように一見予想外の挙動をする。# Get-ChildItem が返戻する要素数が1のため、$bad には サイズ1024バイトのファイルを表すFileInfo型のオブジェクトが代入される。
$bad = Get-ChildItem "1個のサイズ1024バイトのファイルがあるディレクトリ"
# 一見、$bad.Lengthはディレクトリの要素数1が予想されるが、結果は1024が帰ってくる。$badは配列ではなくFileInfo型のオブジェクトで、Lengthプロパティが1024のためである。
$bad.Length
1024 # !?
# 明示的に配列を返したい場合は"@()"でくくる。
$good = @(Get-ChildItem "1個のサイズ1024バイトのファイルがあるディレクトリ" )
# $goodは正しく要素数1の配列のため、Lengthプロパティは1になる。
$good.Length
1
「p」で始まるプロセスを全て停止する[41]。
PS> Get-Process p* | Stop-Process
1000 MB以上のメモリを占有するプロセスを検索し、停止する[42]。
PS> Get-Process | Where { $_.WS -gt 1000MB } | Stop-Process
ディレクトリ中に含まれる全ファイルの合計サイズを計算して出力する[43]。
PS> Get-Childitem | Measure-Object -property length -sum
文字列に含まれる小文字を大文字に変換した文字列を作る[44]。
PS> "hello, world!".ToUpper()
"internal"
という文字列の5文字目の直後に"natio"
という文字列を挿入し、結果として"international"
を得る[45]。
PS> "internal".Insert(5, "natio")
指定したRSSフィードをダウンロードし、最新の8エントリーのタイトルを表示する[46]。
PS> $rssUrl = "http://blogs.msdn.com/powershell/rss.aspx"
PS> $blog = [xml](New-Object System.Net.WebClient).DownloadString($rssUrl)
PS> $blog.rss.channel.item | Select title -first 8
変数 $UserProfile に環境変数 UserProfile の値を代入する。
PS> $UserProfile = $env:UserProfile