前回は、PowerShell がどんな事に使えるのかの紹介と、PowerShell のライトな使い方を解説しました。
今から使う PowerShell
http://www.vwnet.jp/Windows/PowerShell/2018022301/GettingStartedWithPowerSehll-01.htm
今回は、もう少し PowerShell らしい使い方を解説します。
まずは、PowerShell を使う際に日常的に使う基本操作を解説します。
PowerShell Window に表示されている内容をコピーする場合は、コピーしたい範囲をマウスでドラッグして
Enter でコピーします。
マウスのダブルクリックでも選択できます。
全体をコピーする場合は、「すべて選択」が便利です。
矩形選択する場合は、「行の折り返し選択を有効にする」のチェックを外します。
Windows 10 / Windows Server 2016 以降は Ctrl + C でコピーする事が出来ます。
ペーストは、マウスを右クリックします。
Windows 10 / Windows Server 2016 以降は Ctrl + V でペーストする事が出来ます。
途中まで入力した内容を実行せずキャンセルする場合は、Ctrl + C を入力します。
すると、そこまで入力された内容は実行されず、改行されます。
PowerShell は入力履歴を持っており、上下矢印で入力した内容を呼び出せます。
Windows 10 より前の OS はこの入力履歴をメモリー保持しているだけなので、PowerShell Window を閉じると履歴が消えますが、Windows 10 / Windows Server 2016 以降は物理ファイルに保持されているので、PowerShell Window を閉じても履歴は残ります。
物理記録された履歴を削除する場合は、以下のようにして履歴を記録しているファイルを削除します。(外部コマンドを使う際にパスワードを平文入力したとかで、見せたくない情報が履歴に残った時は必ず削除しましょう)
del (Get-PSReadlineOption).HistorySavePath |
PowerShell の TAB 補完は強力で使い勝手が良いので、ぜひ試してください。
何の TAB 補完が出来るかと言うと...
長いコマンドレット名やオプション名を覚える必要はなく、途中まで打って TAB 補完します。
例えばコンピューターの再起動をする場合の Restart-Computer -Force は以下のように呼び出す事が出来ます。
rest[TAB] -f[TAB] |
スクリプト実行許可を与える Set-ExecutionPolicy RemoteSigned -Force は以下のようにして呼び出せます。
set-ex[TAB] r[TAB] -f[TAB] |
実行可能なプログラムやコマンドも TAB 補完出来ますので、プログラムランチャーとして使う事も出来ます。(いちいちメニュー開かなくて良いので便利)
例えばメモ帳を起動する場合は、以下のように補完し notepad.exe を呼び出します。そのまま Enter を叩くとメモ帳が起動します。
note[TAB] |
デバイスマネージャーを起動する場合は、以下のように補完して devmgmt.msc にします。
devm[TAB] |
wbadmin.exe のようなコマンドラインツールの場合、オプションを補完する事は出来ませんが、コマンドそのものの呼び出しは簡単に出来ます。
wba[TAB] |
フォルダ名、ファイル名も補完されるので、メモ帳で hosts を開く場合は、以下のように TAB 補完させる事が出来ます。
note[TAB] notepad.exe c:\win[TAB] notepad.exe C:\Windows\sys[TAB] notepad.exe C:\Windows\System32\dri[TAB] notepad.exe C:\Windows\System32\drivers\et[TAB] notepad.exe C:\Windows\System32\drivers\etc\h[TAB] notepad.exe C:\Windows\System32\drivers\etc\hosts |
PowerShell 専用コマンドを「コマンドレット」と呼びます。
コマンドレットにネーミングルールが決まっていたり、使い方を調べる手段が用意されているので、そのあたりを解説します。
コマンドレットは、以下のネーミングルールになっています。
[動詞]-[名詞] |
コマンドレットは全てこのルールに従っているので、コマンドレット名を見ると何をするコマンドレットなのか想像できるようになっています。
コマンドレットはネーミングルールが決まっているので、目的のコマンドレットを探すのは Get-Command を使って探す事が出来ます。
例えば item の文字列を含むコマンドレットを探すには以下のようにします。
Get-Command *item* |
コマンドレットの使い方を調べるには Get-Help を使います。
例えば、Get-Item の使い方を調べるには以下の様にします。
Get-Help Get-Item |
Get-Help にも沢山のオプションがありますが、よく使うのはこのあたりです。
-Full | すべてのヘルプ |
-Examples | 使用例 |
-Parameter * | オプションの詳細 |
-Online | MS サイトの Web コンテンツ表示 |
コマンドレットを探したり、使い方を調べるのは、google 先生か Bing 先生に聞くのもお勧めです。
コマンドレットの実行結果や、演算結果を格納する変数は、単なる値ではなく「オブジェクト」と呼ばれる形式になっています。
オブジェクトには、プロパティ(値)とメソッド(操作)があり、これらを使う事で様々な事が出来るようになっています。
前回、変数に格納した値を16進数に変換した時に ToString("x") を使ったのを覚えていますか?
この、ToString がメソッドです。
どのようなメソッドとプロパティがあるかの確認は、Get-Member を使います
単純変数の場合プロパティは代入された値だけですが、コマンドレットの実行結果には様々なプロパティがセットされます。
例えば Get-Item で C:\Windows を調べた場合はこんな感じになっています。
プロパティにどのような値が入っているかは、Format-List * で確認できます(省略形の fl * でも OK)
特定プロパティの値を取り出す時は、ピリオドに続けてプロパティ名を書きます。
PowerShell で使用する変数は型を指定せずに使う事が多いです。これは、変数に値がセットされるときに自動的に適切な型が選択される機能を持っているからです。(明示的に型を指定した変数を使う事も出来ます)
文字列代入すれば文字列を扱う型になりますし、数値を代入すれば数値を扱う型になります。
この型を確認するには GetType メソッドを使います。
数値の場合は Int32 、文字列の場合は String 型なのが分かります。
コマンドレットの実行結果等の配列を代入すると配列型になります。
例えば、Get-ChildItem で C:\ を指定した場合、複数の Item が配列として帰ってくるので、オブジェクト配列である Object[] になっています。
配列要素にアクセスする場合は [] で添え字指定します。添え字は0から始まるので、最初の要素にアクセスする場合は [0] とします。
最初の要素の型を見る時には、[0].GetType() します。
今回の例では DirectoryInfo 型の配列であることが分かります。
配列の場合も Get-Member でメソッドとプロパティを確認する事が出来ます。
プロパティの中身を見る場合は、要素を指定します。要素を指定しないと、全要素のプロパティが表示されます。
配列要素のプロパティを取り出す場合も同様に要素を指定してプロパティ名を指定します。
配列にはこれ以外にも色々ありますが、当面困らないハズなので解説はこのくらいにしておきます。
PowerShell のコマンドレットにはエイリアス(別名)が付いています。
これは、よく使うコマンドレットの短縮形であったり、DOS や Linux で馴染みのあるコマンドと同一名にして使いやすさを向上させるためです。
エイリアスを確認するには、Get-Alias を使います。
僕が良く使うエイリアスはこんな感じです。
Alias | コマンドレット |
cls | Clear-Host |
dir | Get-ChildItem |
cd | Set-Location |
echo | Write-Output |
ii | Invoke-Item |
wget | Invoke-WebRequest |
cat | Get-Content |
? | Where-Object |
% | ForEach-Object |
ft | Format-Table |
fl | Format-List |
さて、ここからが今回のメインイベントですょ
コマンドレットを実行すると、全ての結果が出ます。
全ての情報を得たい場合はこれで良いのですが、特定の条件に該当する情報だけが欲しい場合は、条件に合致した情報だけを抽出したいですよね。
PowerShell には、が移動情報だけを抽出する機能も備わっています。
コマンドレットを単体で Get-ChildItem C:\Windows\ を実行するとこんな感じになりますね。
大量にデータが出力され、画面からあふれてしまいました。バッファには残っているのでスクロールすれば全データを見るとこが出来ますが、いまいちイケてないです。
PowerShell コマンドレットの出力は、パイプ( | )でリダイレクトする事が出来ます。
リダイレクトすると、出力を別のコマンドレットや条件式の入力にする事が出来ます。
条件に合致するオブジェクトを抽出するコマンドレットにリダイレクトをすると、必要なデータだけを抽出する事が出来ます。
例えば、先ほどの結果で 1MB 以上のファイルだけを抽出する場合は、こんな感じにします。
Get-ChildItem C:\Windows\ | ?{ $_.Length -ge 1MB } |
初めて見ると 何ですかコレ? なので、こいつの説明をします。
パイプで Get-ChildItem の出力を ? に渡しているのは先ほど説明したとおりですね。
? は Where-Object のエイリアスです。
Where-Object
は受け取った出力結果(オブジェクト配列)のうちスクリプトブロック {} で指定した条件に合致するオブジェクトを抽出するコマンドレットです。
Where-Object は受け取ったオブジェクト配列を配列要素にバラし要素1つづつに対してスクリプトブロックの条件で評価します。
スクリプトブロックである {} 内にある $_ は、バラされたオブジェクトで、$_.Length は受け取ったオブジェクトの Length プロパティを意味しています。
-ge は、比較演算子の >= の意味です(greater or equal)
1MB は比較する値ですね。
つまり、Get-ChildItem C:\Windows\ | ?{ $_.Length -ge 1MB } は、C:\Windows\ にあり、1MB 以上のファイルを抽出する意味になります。
以下の様にすると、抽出結果を変数に代入する事も出来ます。
$a = Get-ChildItem C:\Windows\ | ?{ $_.Length -ge 1MB } |
ここで注意が必要なのは、抽出したオブジェクトが1つだった場合、変数は配列ではなくなってしまいます。
この変数を使って何か処理をする場合は、変数がオブジェクト配列になっているか否かの確認が必要になるので、変数を [array] 指定して明示的にオブジェクト配列にしておくのがお勧めテクです。
PowerShell 3 以降であれば、以下の様に省略することも可能です。
Get-ChildItem C:\Windows\ | ? Length -ge 1MB |
パイプは便利なのですが、意外と処理が遅いので、大量データを処理する場合はパイプでワンライナー(1行に処理を書く手法)にするのではなく、スクリプトにした方が処理が早くなります。
良く使う比較演算子は以下のようなものがあります。
PowerShell | C/C++ | 意味 |
-eq | == | 等しい |
-ne | != | 等しくない |
-gt | > | より大きい |
-ge | >= | 以上 |
-lt | < | より小さい |
-le | <= | 以下 |
-like | N/A | ワイルドカードと等しい |
-match | N/A | 正規表現と等しい |
これらの演算子は、文字列比較時に大文字小文字を区別しません。
大文字小文字を区別する場合は、-ceq のように c を付けた比較演算子を使います。
比較演算子で比較する相手が数値の場合は単純比較なのであまり問題にはならないのですが、比較相手が文字列の場合は文字列を表現するルールがいくつかあります。
文字列の開始と終了はシングルクォーテーションかダブルクォーテーションで囲みます。
PowerShell の場合、シングルクォーテーションとダブルクォーテーションで意味が違ってきます。
囲み記号 | 働き |
シングルクォーテーション | 囲った文字がそのまま文字列になる |
ダブルクォーテーション | 変数が展開された文字列になる |
例えば、以下の様にシングルクォーテーションで囲むと、$a は文字列として扱われます。
$a = 'abc' $b = '$a def' |
これに対し、ダブルクォーテーションで囲むと、$a は変数として扱われ、変数が展開された文字列として扱われます。
$c = 'ghi' $d = "$c jkl" |
シングルクォーテーションやダブルクォーテーションなど、特別な意味を持った記号を文字として扱う場合は `(バッククオート) でエスケープします。
例えば「123"bcd'789」と言う文字列を扱いたいときは、以下の様に表現します。
"123`"bcd`'789" |
実際にどのようになったのかを確認するには、一度変数に格納して表示します。
$a = "123`"bcd`'789" |
ダブルクォーテーション内の $ を文字として扱う場合も、`$ のようにエスケープします
$b = "abc `$def" |
PowerShell は Windows 7 / Windows Server 2008 R2 以降にプレインストールされています。
OS バージョン | プレインストールバージョン |
Windows 7 / Windows Server 2008 R2 | 2.0 |
Windows 8 / Windows Server 2012 | 3.0 |
Windows 8.1 / Windows Server 2012 R2 | 4.0 |
Windows 10(初期) | 5.0 |
Windows 10(1511以降) / Windows Server 2016 | 5.1 |
これを書いている段階での最新版は、5.1 と 6.0 です。
実は 6.0 から Linux/MacOS でも動くマルチプラットフォーム対応の OSS 製品となり、従来の 5.1 までの Windows 専用版とは中身が別物になっています。
従来の Windows 専用版と 6.0 は互換性を維持する方針にはなっていますが、6.0 ではサポートされていないコマンドレットがあったり、オプションが違っていたりするので完全互換ではありません。
このため、5.1 に対してのサポートは今後も継続されますが、新規機能は追加されない方針になっています。
PowerShellのバージョンに必要なモジュールと .NET Framework の関係は以下の様になっています。
PowerShell | 必要モジュール | .NET Framework |
3.0 | WMF 3.0 | .NET Framework 4.0 |
4.0 | WMF 4.0 | .NET Framework 4.5 |
5.0 | WMF 5.0 | .NET Framework 4.5 |
5.1 | WMF 5.1 | .NET Framework 4.5.2 |
6.0 | installer | .NET Core 2.0 |
WMF : Windows Management Framework
このため、Windows 版の最新版である 5.1 にアップデートするには以下モジュールが必要になります。
OS バージョン | .NET 更新 | WMF インストール |
Windows 7 / Windows Server 2008 R2 | 必要 | 必要 |
Windows 8 / Windows Server 2012 | 必要 | 必要 |
Windows 8.1 / Windows Server 2012 R2 | 必要 | 必要 |
Windows 10(初期) | 不要 | 不要 |
Windows 10(1511以降) / Windows Server 2016 | 不要 | 不要 |
.NET の最新版は以下からダウンロードできます。
Windows 用の.NET Framework 4.7.1 オフライン インストーラー
https://support.microsoft.com/ja-jp/help/4033342/the-net-framework-4-7-1-offline-installer-for-windows
WMF の最新版は以下からダウンロードできます。
WMF 5.1 のインストールと構成 | Microsoft Docs
https://docs.microsoft.com/ja-jp/powershell/wmf/5.1/install-configure
初期版の Windows 10 用の WMF 5.1 は提供されていないので、LTSB 2015 の場合は PowerShell 5.0 のまま使う事になります。
LTSB 2015 以外の環境は、最新へ Build Update すれば、PowerShell 5.1 になります。
PowerShell 6.0 は GitHub にインストーラーが公開されているので、プラットフォームにあった方法でインストールしてください。
GitHub - PowerShell/PowerShell: PowerShell for every
system!
https://github.com/PowerShell/PowerShell
なお、PowerShell 5.1 と PowerShell 6.0 の共存は可能です。
マウスでドラッグして Enter
右クリック
Ctrl + C
上下矢印
del (Get-PSReadlineOption).HistorySavePath
で記録ファイル削除
コマンドレット名とオプション
実行コマンド
コマンドラインツール
フォルダ名、ファイル名
[動詞]-[名詞]
Get-Command
Get-Help
プロパティ(値)
メソッド(操作)
どのようなメソッドとプロパティがあるかの確認は Get-Member
どのような値が入っているかは、Format-List *
プロパティの値を取り出す時は、ピリオド + プロパティ名
自動的に適切な型が選択される
GetType
オブジェクト配列
[] で添え字指定
短縮形であったり、DOS や Linux で馴染みのあるコマンドと同一名の別名
Get-Alias
コマンドレットの出力を、別のコマンドレッドの入力にする
コマンドレット | ?{ $_.プロパティ 比較演算子 比較対象 }
= とかではなく、-eq みたいな形式
シングルクォーテーションは、囲った文字がそのまま文字列になる
ダブルクォーテーションは、変数が展開された文字列になる
`(バッククオート) でエスケープ
6.0 から Linux/MacOS でも動くマルチプラットフォーム対応の OSS 製品となり、従来の 5.1 までの
Windows 専用版とは中身が別物
PowerShell 5.1 と PowerShell 6.0 の共存可能
今日から使う PowerShell
http://www.vwnet.jp/Windows/etc.asp#GettingStartedWithPowerShell
PowerShellの演算子
http://www.vwnet.jp/Windows/PowerShell/Ope/OpeListg.htm
Windows Management Framework (WMF) | Microsoft Docs
https://docs.microsoft.com/ja-jp/powershell/scripting/windows-powershell/wmf/overview?WT.mc_id=WD-MVP-36880
GitHub - PowerShell/PowerShell: PowerShell for every system!
https://github.com/PowerShell/PowerShell
Copyright © MURA All rights reserved.