PowerShell チュートリアル
PowerShellを使い始める
サーチ…
備考
Windows PowerShellは、.NET Framework上に構築されたMicrosoftの自動化/構成管理フレームワークであるWindows Management Frameworkのシェルおよびスクリプトコンポーネントです。 PowerShellは、Windows 7 / Windows Server 2008 R2以降、サポートされているWindowsクライアントおよびサーバーオペレーティングシステムのすべてのバージョンに既定でインストールされます。 Powershellは、 Windows管理フレームワーク (WMF)のそれ以降のバージョンをダウンロードすることにより、いつでも更新することができます。 PowerShell 6の「Alpha」バージョンはクロスプラットフォーム(Windows、Linux、およびOS X)であり、 このリリースページからダウンロードしてインストールする必要があります 。
その他のリソース:
- MSDNドキュメント: https : //msdn.microsoft.com/en-us/powershell/scripting/powershell-scripting
- TechNet: https : //technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- PowerShellギャラリー: https : //www.powershellgallery.com/
- MSDNブログ: https : //blogs.msdn.microsoft.com/powershell/
- Github: https : //github.com/powershell
- コミュニティサイト: http : //powershell.com/cs/
バージョン
バージョン | Windowsに含まれる | ノート | 発売日 |
---|---|---|---|
1.0 | XP / Server 2008 | 2006-11-01 | |
2.0 | 7 / Server 2008 R2 | 2009-11-01 | |
3.0 | 8 / Server 2012 | 2012-08-01 | |
4.0 | 8.1 / Server 2012 R2 | 2013-11-01 | |
5.0 | 10 / Server 2016 Techプレビュー | 2015-12-16 | |
5.1 | 10周年記念版/サーバー2016 | 2017-01-27 |
インストールまたはセットアップ
Windows
PowerShellはWindows Management Frameworkに含まれています。現代版のWindowsでは、インストールとセットアップは不要です。
PowerShellの更新は、Windows Management Frameworkの新しいバージョンをインストールすることで実現できます。
その他のプラットフォーム
PowerShell 6の「ベータ版」は他のプラットフォームにもインストールできます。インストールパッケージはこちらから入手できます 。
たとえば、Ubuntu 16.04用のPowerShell 6は、簡単なインストール(および更新)のためにパッケージリポジトリに公開されています。
インストールするには、以下を実行します。
# Import the public repository GPG keys curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # Register the Microsoft Ubuntu repository curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list # Update apt-get sudo apt-get update # Install PowerShell sudo apt-get install -y powershell # Start PowerShell powershell
Microsoftのリポジトリをスーパーユーザーとして登録した後は、 sudo apt-get upgrade powershell
を使用して更新するだけで済みます。それからpowershell
実行するだけpowershell
マシンに保存されているスクリプトの署名なし実行を許可する
セキュリティ上の理由から、PowerShellは既定で署名付きスクリプトの実行のみを許可するように設定されています。次のコマンドを実行すると、署名のないスクリプトを実行できます(これを行うには、管理者としてPowerShellを実行する必要があります)。
Set-ExecutionPolicy RemoteSigned
PowerShellスクリプトを実行する別の方法は、 Bypass
をExecutionPolicy
として使用することです。
powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
または、次のコマンドを実行して、既存のPowerShellコンソールまたはISEセッション内から行います。
Set-ExecutionPolicy Bypass Process
実行ポリシーの一時的な回避策は、 -ExecutionPolicy
実行可能ファイルを実行し、有効なポリシーを-ExecutionPolicy
パラメーターとして渡すことによっても達成できます。ポリシーはプロセスの生存期間中のみ有効であるため、レジストリに対する管理アクセスは必要ありません。
C:\>powershell -ExecutionPolicy RemoteSigned
他にも複数のポリシーが用意されており、オンラインのサイトでは、しばしばSet-ExecutionPolicy Unrestricted
を使用することをお勧めします。このポリシーは変更されるまでそのまま残り、システムのセキュリティスタンスを低下させます。これはお勧めできません。 RemoteSigned
使用は、ローカルに保存され、記述されたコードを許可し、リモートで取得したコードに信頼されたルートの証明書で署名する必要があるため推奨されます。
また、実行ポリシーがグループポリシーによって強制されることに注意してください。ポリシーがUnrestricted
システム全体に変更されても、グループポリシーは次の実行間隔(通常は15分)でその設定を元に戻す可能性があります。 Get-ExecutionPolicy -List
を使用して、さまざまなスコープで実行ポリシーセットを確認できます
TechNetドキュメント:
Set-ExecutionPolicy
about_Execution_Policies
エイリアスと類似の関数
PowerShellでは、同じ結果を達成するための多くの方法があります。これはシンプルでおなじみのHello World
例でうまく説明できます:
Write-Host
使用:
Write-Host "Hello World"
Write-Output
使用:
Write-Output 'Hello world'
Write-Output
& Write-Host
両方が画面に書き込むにもかかわらず、微妙な違いがあることは注目に値する。 Write-Host
はstdout(コンソール画面)にのみ書き込みますが、 Write-Output
はstdout と出力[success]ストリームの両方に書き込みを行い、 リダイレクトを許可します。リダイレクト(および一般的なストリーム)では、1つのコマンドの出力を変数への代入を含む別のコマンドへの入力として指示することができます。
> $message = Write-Output "Hello World"
> $message
"Hello World"
これらの類似機能はエイリアスではありませんが、成功ストリームを「汚染」させたくない場合は同じ結果が得られます。
Write-Output
はEcho
またはWrite
エイリアスされます
Echo 'Hello world'
Write 'Hello world'
または、単に「Hello world」と入力するだけです!
'Hello world'
これらのすべてが期待されるコンソール出力になります
Hello world
PowerShellのエイリアスの別の例として、古いコマンドプロンプトコマンドとBASHコマンドをPowerShellコマンドレットに共通にマッピングする方法があります。以下のすべては、現在のディレクトリのディレクトリリストを生成します。
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
最後に、Set-Aliasコマンドレットを使用して独自のエイリアスを作成できます。例として、 Test-NetConnection
(本質的にはコマンドプロンプトのpingコマンドと同等のPowerShell)を「ping」とします。
Set-Alias -Name ping -Value Test-NetConnection
Test-NetConnection
代わりにping
を使用できるようになりました!エイリアスがすでに使用されている場合は、関連付けを上書きすることに注意してください。
エイリアスは、セッションがアクティブになるまで有効です。セッションを閉じて、最後のセッションで作成したエイリアスを実行しようとすると、動作しません。この問題を解決するには、作業を開始する前に、エキスパートのすべてのエイリアスをセッションに一度インポートします。
パイプライン - PowerShellコマンドレットからの出力の使用
PowerShellを使用してスクリプトを作成するときに最初に質問したことの1つは、コマンドレットの出力を操作して別の操作を実行する方法です。
パイプライン記号|
コマンドレットの末尾で使用され、エクスポートされたデータを次のコマンドレットにフィードします。単純な例は、Get-ChildItemから表示されるファイルのNameプロパティのみを表示するためにSelect-Objectを使用することです。
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
より高度なパイプラインの使用により、コマンドレットの出力をforeachループにパイプすることができます。
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
上記の例では、$ _自動変数を使用しています。 $ _は$ PSItemの短いエイリアスで、パイプラインの現在の項目を含む自動変数です。
コメント
#
(ハッシュ)記号を使用して行を追加することによってパワースクリプトにコメントする
# This is a comment in powershell
Get-ChildItem
また、コメントの先頭と末尾にそれぞれ<#
と#>
を使用して複数行のコメントを付けることもできます。
<#
This is a
multi-line
comment
#>
Get-ChildItem
.NETライブラリメソッドの呼び出し
Static .NetライブラリメソッドはPowerShellから呼び出すことができます。これは、完全なクラス名を3番目の括弧内にカプセル化し、次に::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
静的メソッドはクラス自体から呼び出すことができますが、非静的メソッドを呼び出すには.Netクラス(オブジェクト)のインスタンスが必要です。
たとえば、AddHoursメソッドをSystem.DateTimeクラス自体から呼び出すことはできません。クラスのインスタンスが必要です。
C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
この場合、最初にオブジェクトを作成します 。たとえば、次のようにします 。
C:\> $Object = [System.DateTime]::Now
次に、そのオブジェクトのメソッドを使用できます.AddHoursメソッドのように、System.DateTimeクラスから直接呼び出すことのできないメソッドさえも使用できます。
C:\> $Object.AddHours(15)
Monday 12 September 2016 01:51:19
オブジェクトの作成
New-Object
コマンドレットは、オブジェクトの作成に使用されます。
# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime
# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
多くの場合、新しいオブジェクトが作成され、データをエクスポートしたり、別のコマンドレットに渡したりします。これはそうすることができます:
$newObject = New-Object -TypeName PSObject -Property @{
ComputerName = "SERVER1"
Role = "Interface"
Environment = "Production"
}
オブジェクトを作成する方法はたくさんあります。 PSCustomObject
を作成するには、おそらく次の方法が最短かつ最速の方法PSCustomObject
。
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
既にオブジェクトを持っていて、追加プロパティが1つまたは2つだけ必要な場合は、 Select-Object
を使用してそのプロパティを追加するだけです。
Get-ChildItem | Select-Object FullName, Name,
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
すべてのオブジェクトを変数に格納するか、パイプラインに渡すことができます。これらのオブジェクトをコレクションに追加し、最後に結果を表示することもできます。
オブジェクトのコレクションはExport-CSV(およびImport-CSV)でうまく機能します。 CSVの各行はオブジェクトであり、各列はプロパティです。
書式コマンドは、表示のためにオブジェクトをテキストストリームに変換します。オブジェクトのユーザビリティを維持するために、データ処理の最終段階までFormat- *コマンドを使用しないでください。