サーチ…


備考

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)であり、 このリリースページからダウンロードしてインストールする必要があります

その他のリソース:

バージョン

バージョン 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スクリプトを実行する別の方法は、 BypassExecutionPolicyとして使用することです。

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-OutputWrite-Host両方が画面に書き込むにもかかわらず、微妙な違いがあることは注目に値する。 Write-Hostはstdout(コンソール画面)にのみ書き込みますが、 Write-Outputはstdout 出力[success]ストリームの両方に書き込みを行い、 リダイレクトを許可します。リダイレクト(および一般的なストリーム)では、1つのコマンドの出力を変数への代入を含む別のコマンドへの入力として指示することができます。

> $message = Write-Output "Hello World"
> $message
"Hello World"

これらの類似機能はエイリアスではありませんが、成功ストリームを「汚染」させたくない場合は同じ結果が得られます。

Write-OutputEchoまたは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- *コマンドを使用しないでください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow