PowerShell

PowerShellの使い方でお悩みのあなたへ。この記事では、Windows PowerShellとは何か、その使い方について入門者向けにご紹介しています。これを見れば、PowerShellを使いこなせるようになれます。

PowerShellとは

Windows PowerShellとは、コマンドプロンプト(cmd.exe)の後継となるコマンドラインインタフェース(CLI)である。

テキストのコマンドを入力することで、Microsoft Windowsを操作できる。コマンドによる操作を支援する機能も含まれている。

Figure 1. Windows PowerShell

使い方

Windows 7の場合、スタートメニューから[アクセサリ] - [Windows PowerShell] - [Windows PowerShell]を選択する。PowerShellを管理者として実行するには、右クリックメニューから「管理者として実行」を選択する。

Windows 10の場合、スタートメニューの [W] - [Windows PowerShell] から次のいずれかを選択する。

PowerShellアプリケーション
アプリケーション 説明
Windows PowerShell 64ビット版のWindows PowerShell
Windows PowerShell (x86) 32ビット版のWindows PowerShell
Windows PowerShell ISE 64ビット版のWindows PowerShell 統合スクリプティング環境
Windows PowerShell ISE (x86) 32ビット版のWindows PowerShell 統合スクリプティング環境

ISEとはIntegrated Scripting Environmentの略で、統合スクリプティング環境のことである。ISEではスクリプトのデバッグなどの開発環境も備えている。

Windows StoreからWindows Terminalをインストールしてあれば、Windows TerminalからもPowerShellを実行できる。

コマンドレット

PowerShellではコマンドのことをコマンドレットと呼ぶ。PowerShellにどのようなコマンドレットがあるのか確認するには、 Get-Comannd コマンドレットを実行する。なお、PowerShellではコマンドレットの大文字と小文字を区別しない。

各コマンドレットの使用方法を調べるには、 Get-Help コマンドレットを実行するか、調べたいコマンドレットを -? オプションを指定して実行する。

Get-Help Cmdlet

または

Cmdlet -?

Cmdlet には調べたいコマンドレットの名前を指定する。

PowerShellのコマンドレット一覧
コマンドレット 別名 説明
Compare-Object diff オブジェクトを比較する。
Copy-Item cp 項目をコピーする。
ForEach-Object コレクション内の各アイテムをループ処理する。
Get-AppPackage インストールされているアプリケーションパッケージのリストを取得する。
Get-ChildItem dir, ls 指定した場所から項目及び子項目を取得する。
Get-Command コマンドレットの一覧を表示する。
Get-Content type 項目の内容を取得する。
Get-Help ヘルプを表示する。
Remove-AppxPackage ユーザアカウントからアプリケーションパッケージを削除する。
Remove-Item del, rd, rm, rmdir 項目を削除する。
Rename-Item 項目の名前を変更する。
Set-ExecutionPolicy 実行ポリシを設定する。
Set-Location cd, chdir 現在の作業場所を設定する。
Sort-Object プロパティ値に基づいてオブジェクトを並び替える。
Set-Variable set 変数の値を設定する。
Write-Host コンソールに文字列を表示する。
Write-Output echo オブジェクトを標準出力へ出力する。

PowerShellスクリプト

Windows PowerShellはスクリプト言語の機能も提供している。PowerShellスクリプトファイルの拡張子は「.ps1」である。PowerShellスクリプトはエクスプローラからダブルクリックしても実行できない。PowerShellはカレントフォルダを検索しないため、カレントフォルダにあるPowerShellスクリプトを実行する場合にも相対パス名又は絶対パス名で指定する必要がある。

PS C:\Users\marina> ./Foo.ps1

または

PS C:\Users\marina> C:\Users\marina\Foo.ps1

のように指定する。

PowerShellスクリプトを実行する場合、ファイル拡張子「.ps1」は省略することができる。

PowerShellでは、セキュリティ上の理由によりデフォルトでスクリプトの実行ができないようになっている。スクリプトを実行するには、あらかじめPowerShellのスクリプト実行ポリシを設定しておく必要がある。実行ポリシを変更するには、PowerShellを管理者として実行し、Set-ExecutionPolicyコマンドレットを実行する。

Set-ExecutionPolicy RemoteSigned

スクリプト起動パラメータ

スクリプト起動時のオプション及び引数の定義方法は次のとおり。

Param ( switch,switch... attribute parameter, attribute parameter... )
switch
スクリプトのスイッチ(オプション)を次の書式で指定する。
[switch] $SwitchName
attribute
パラメータの属性を次の書式で指定する。
[Parameter(Mandatory=boolean)]

booleanには、パラメータの指定が必須の場合は$True、パラメータの指定が省略可能な場合は$Falseを指定する。

parameter
スクリプトのパラメータを次の書式で指定する。
[type] $ParameterName

型演算子

型演算子 説明
-is 型が一致する
-isnot 型が一致しない
-as 型のキャスト

変数

PowerShellの変数名の命名規則は次のとおり。

変数に値を設定する。

var = expr

PowerShellの変数はデータ型を区別しないので、数値も文字列も設定できる。

var1 = 10
var2 = "foo"
var3 = 1 + 2
var4 = "foo" + "bar"

Get-Variable

Get-Variable は変数の一覧を表示するコマンドレットである。

PS C:\> Get-Variable

Name                           Value
----                           -----
$
?                              True
^
args                           {}

Import-CSV

Import-CSVはCSVファイルをインポートするPowerShellコマンドレットである。

PS C:\> Import-CSV example.csv

Family name Given name Age
----------- ---------- ---
Shiratori   Sana       16
Nonaka      Kokona     15
Sato        Neo        14

Out-GridViewコマンドレットを併用すると、CSVファイルの内容をビューアウィンドウで見ることができる。

PS C:\>import-CSV example.csv | Out-GridView

Get-AppPackage

ユーザプロファイルにインストールされたアプリケーションパッケージのリストを取得する。

Get-AppPackage

アプリケーションパッケージ名を指定することもできる。

PS C:\> Get-AppxPackage Microsoft.Windows.Cortana


Name              : Microsoft.Windows.Cortana
Publisher         : CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Architecture      : Neutral
ResourceId        : neutral
Version           : 1.13.0.18362
PackageFullName   : Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy
InstallLocation   : C:\Windows\SystemApps\Microsoft.Windows.Cortana_cw5n1h2txyewy
IsFramework       : False
PackageFamilyName : Microsoft.Windows.Cortana_cw5n1h2txyewy
PublisherId       : cw5n1h2txyewy
IsResourcePackage : False
IsBundle          : False
IsDevelopmentMode : False
NonRemovable      : True
IsPartiallyStaged : False
SignatureKind     : System
Status            : Ok

Invoke-WebRequest

Invoke-WebRequest コマンドレットは、Web ページまたは Web サービスに対して HTTP および HTTPS リクエストを送信する。レスポンスを解析し、リンク、画像及びその他の重要な HTML 要素のコレクションを返す。

Invoke-WebRequest [-Uri] uri [CommonParameters]

エイリアス

curl
wget

Remove-AppxPackage

Remove-AppxPackageコマンドレットは、ユーザーアカウントからアプリケーションパッケージ(*.appx)を削除する。

アプリケーションパッケージのファイル名拡張子は .msix または .appx である。

Windows GUI からではアンインストールできないアプリケーションでも、PowerShell からアンインストールできる。

Remove-AppxPackageコマンドレットには、次に示すオプションを指定できる。

-Package
パッケージのフルネームまたはAppxPackageオブジェクトを指定する。

マップのアンインストール

マップをアンインストールするには、PowerShellから次のコマンドを実行する。

Get-AppxPackage Microsoft.WindowsMaps | Remove-AppxPackage

Xbox Game Barのアンインストール

Xbox Game Barをアンインストールするには、PowerShellから次のコマンドを実行する。

Get-AppxPackage Microsoft.XboxGamingOverlay | Remove-AppxPackage

Rename-Item

正規表現を使って複数のファイルの名前を一括して変更する例を示す。

PS C:\> Get-ChildItem *
-a--- 2015/06/29 00:00 1000 foo_1.txt
-a--- 2015/06/29 00:00 1000 foo_2.txt
-a--- 2015/06/29 00:00 1000 foo_2.txt
PS C:\> Get-ChildItem * | Rename-Item -NewName { $_.Name -replace 'foo', 'bar' }
PS C:\> Get-ChildItem *
-a--- 2015/06/29 00:00 1000 bar_1.txt
-a--- 2015/06/29 00:00 1000 bar_2.txt
-a--- 2015/06/29 00:00 1000 bar_2.txt

文字列の検索

指定した文字列を含む行を表示する。

Select-String -Path index.html -Pattern "<title>"

ワイルドカードを使用して、複数のファイルの中から指定した文字列を含む行を表示する。

Select-String -Path *.html -Pattern "<title>"

指定した文字列を含まない行を表示する。

Select-String -Path index.html -Pattern "<title>" -NotMatch

指定した文字列を含むファイル名のみを表示する。

Select-String -Path *.html -Pattern "<title>" | Select -u Filename

指定した文字列を含むファイルのパス名のみを表示する。

Select-String -Path *.html -Pattern "<title>" | Select -u Path

Unblock-File

インターネットからダウンロードしたファイルは、コンピュータを保護するために、操作が制限されることがある。このようなファイルは、エクスプローラからファイルのプロパティを表示することで確認できる。ブロックされているファイルは「このファイルは他のコンピューターから取得したものです。このコンピューターを保護するため、このファイルへのアクセスはブロックされる可能性があります。」と表示される。ファイルのプロパティで「許可する」にチェックを入れてOKボタンをクリックすることで、ブロックを解除することができる。

Figure 1. ブロックされたファイル

PowerShellのUnblock-Fileコマンドレットを使うことで、インターネットからダウンロードしたファイルのブロックを解除することができる。

Unblock-File [-Path] String[][-WhatIf] [-Confirm] [CommonParameters]
Unblock-File -LiteralPath String[][-WhatIf] [-Confirm] [CommonParameters]

以下に示すコマンドオプションをUnblock-Fileコマンドレットに指定できる。

-Confirm
ファイルのブロックを解除する前に、操作を実行するかどうかを確認する。
PS C:\Users\tsuka\Documents> unblock-file example.csv -confirm

確認
この操作を実行しますか?
対象 "C:\Users\tsuka\Documents\example.csv" に対して操作 "Unblock-File" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

インターネットからダウンロードしたExcelファイルのブロックを解除する。

PS C:\> Unblock-File -Path C:\Users\tsuka\Documents\Downloads\example.xls

Write-Host

Write-Hostはコンソールに文字列を表示するコマンドレットである。

テキストファイルを読み込んでコンソールにその文字列を表示する例を示す。

$f = (Get-Content example.txt) -as [sring[]]
foreach ($l in $f) {
  Write-Host $l
}

$Env

環境変数の値を表示する。

$Env:variable

環境変数 WINDIR の値を表示する例を次に示す。

PS C:\> $Env:windir
C:\Windows

環境設定に値を設定する。

$env:variable="value"
variable
環境変数の名前
value
環境変数の値

環境変数の値の末尾に追加する。

$env:Path+=";C:\tmp"

環境変数を削除する。

$Env:variable = ''

PowerShellにおいて、環境変数に空文字を設定することはできない。この構文は、環境変数に空文字を設定するのではなく、環境変数そのものを削除することを意味する。

$OutputEncoding

PowerShellの出力エンコーディング

PS C:\> $OutputEncoding


IsSingleByte      : True
BodyName          : us-ascii
EncodingName      : US-ASCII
HeaderName        : us-ascii
WebName           : us-ascii
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 20127

PowerShellの文字コードをShift JISに変更する。

PS C:\> $OutputEncoding = [Console]::OutputEncoding
PS C:\> $OutputEncoding


BodyName          : iso-2022-jp
EncodingName      : 日本語 (シフト JIS)
HeaderName        : iso-2022-jp
WebName           : shift_jis
WindowsCodePage   : 932
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 932

PowerShellの文字コードをUTF-8に変更する。

PS C:\> $OutputEncoding = New-Object System.Text.UTF8Encoding
PS C:\> $OutputEncoding


BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 65001

$PSVersionTable

$PSVersionTable はPowerShellのバージョンを格納している変数である。

$PSVersionTable
PSVersionMajor
Minor
Build
Revision
PSEdition-
PSCompatibleVersionsMajor
Minor
Build
Revision
BuildVersionMajor
Minor
Build
Revision
CLRVersionMajor
Minor
Build
Revision
WSManStackVersionMajor
Minor
Build
Revision
PSRemotingProtocolVersionMajor
Minor
Build
Revision
SerializationVersionMajor
Minor
Build
Revision

PowerShellのバージョン確認

PowerShellのバージョン確認を行うには、$PSVersionTableを確認する。

PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.610
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.610
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

PSVersion

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  610

PS C:\> $PSVersionTable.PSVersion.Major
5

PSCompatibleVersions

PS C:\>  $PSVersionTable.PSCompatibleVersions

Major  Minor  Build  Revision
-----  -----  -----  --------
1      0      -1     -1
2      0      -1     -1
3      0      -1     -1
4      0      -1     -1
5      0      -1     -1
5      1      19041  1682

bootrec.exe

bootrec.exeはブートレコードの修復を行うコマンドである。

システムパーティションに新しいブートセクタを書き込む。

bootrec.exe /FixBoot

システムパーティションにマスタブートレコード(MBR)を書き込む。

bootrec.exe /FixMbr

Windowsと互換性があるインストールを探すために、すべてのディスクをスキャンする。

bootrec.exe /RebuildBcd

regsvr32.exe

COMコンポーネントをシステムに登録するためには、Windows付属のコンソールプログラム regsvr32 を使用します。

regsvr32 [/u] [/s] [/n] [/i[:コマンドライン]] ファイル名

ファイル名で指定されたコンポーネント内の DllRegisterServer 関数を呼び出して、コンポーネントをシステムに登録します。

regsvr32 コマンドには次のようなオプションがあります。

/u
指定されたコンポーネント内の DllUnregisterServer 関数を呼び出して、コンポーネントをシステムから解除します。
/s
メッセージボックスを表示せずに実行します。
/i
省略可能な [コマンドライン] 文字列を引数として、指定されたコンポーネント内の DllInstall(TRUE, コマンドライン文字列) 関数を呼び出します。 /u オプションと併用した場合は、指定されたコンポーネント内の DllInstall(FALSE, コマンドライン文字列) 関数を呼び出します。
/n
DllRegisterServer 関数を呼び出しません。/u と併用した場合は DllUnregisterServer 関数を呼び出しません。このオプションは /i オプションと併用する必要があります。

dsget.exe

Active Directoryの中のプロパティを表示する。

dsget user dn option...
dn

表示するユーザオブジェクトの識別名(DN)を指定する。識別名の指定を省略した場合は、標準入力(stdin)から識別名を取得する。

optionには次のオプションを指定できる。

-dn
ユーザの識別名(DN)を表示する。
-samid
ユーザのセキュリティアカウントマネージャ(SAM)アカウント名を表示する。
-sid
ユーザのセキュリティ識別子(SID)を表示する。
-upn
ユーザのプリンシパル名(UPN)を表示する。
-fn
ユーザの名前を表示する。
-mi
ユーザのミドルネームの頭文字を表示する。
-ln
ユーザの姓を表示する。
-display
ユーザの表示名を表示する。
-empid
ユーザの社員IDを表示する。
-desc
ユーザの説明を表示する。
-full
ユーザのフルネームを表示する。
-office
ユーザのオフィスの所在地を表示する。
-tel
ユーザの電話番号を表示する。
-email
ユーザの電子メールアドレスを表示する。
-hometel
ユーザの自宅電話番号を表示する。
-pager
ユーザのポケットベル番号を表示する。
-mobile
ユーザの携帯電話を表示する。
-fax
ユーザのファクシミリ番号を表示する
-iptel
ユーザのIP電話番号を表示する。
-company
ユーザの会社情報を表示する。
-mgr
ユーザのマネージャ情報を表示する。
-mustchpwd
次回ログオン時にユーザがパスワードを変更する必要がある(yes)かない(no)かを表示する。
-canchpwd
ユーザがパスワードを変更できる(yes)かできない(no)かを表示する。
-pwdneverexpires
ユーザのパスワードが無期限である(yes)か無期限でない(no)かを表示する。
-disabled
ユーザアカウントのログインが無効化されている(yes)かされていない(no)かを表示する。

PowerShell

C:\WINDOWS> dir