使ってみよう PowerShell
PowerShell とは
 シェル
 conhost 上でホストされる powershell.exe
 Desktop / Server Core で利用可能
 スクリプト言語
 固有の言語体系・構文
 固有のコマンド(コマンドレット)
 スクリプト実行環境
 powershell.exe を実行エンジンとしてスクリプトファイルを実行
実は…
 PowerShell には大きく2種類ある
 Windows PowerShell
 PowerShell 1.0 ~ 5.1
 Windows 専用 / Windows Server 2008 以降はビルトイン
 .NET Framework 依存 / WMF の一部
 PowerShell Core
 PowerShell 6.0 ~
 Windows / macOS / Linux
 .NET Core 依存
 互換性は、あったりなかったり
 言語としては互換
 ランタイムは(完全には)互換ではない
PowerShell の特徴
 オブジェクトベース
 処理(パイプライン)を流れるのはオブジェクト
 型がある・型を意識する
 但し、デフォルトの設定だとかなり緩い
 暗黙的にある程度型変換(キャスト)される
 システム管理系のコマンドレットが充実している
 Windows Server の管理作業はほぼ全て実行可能
 概ね、Windows Server 2012 R2 以降
 GUI の管理ツールは、裏で PowerShell のコマンドレットを実行
何ができるか?
 基本、何でもできる
 Linux のシェルでやっているような事
 プロセス一覧で、特定ユーザのプロセスをフィルタして、メモリ使用量の高い順から10件分を表示
 テキストを処理・整形して、特定の URL へ POST
 ファイルのハッシュ値の計算
 GUI を表示
 ASDK Installer
 .NET Framework のユーザインタフェースクラスのインスタンスを生成
 イベントを監視して、イベントトリガーで処理を実行
 特定のフォルダにファイルが置かれたら、zip圧縮
 リモート処理
 .NET Framework / Core のクラスを直接操作
 WMI へのアクセス
何に使うか?(得意な事)
 Windows の管理
 管理ツールのすべての操作は、基本的に実行可能
 Azure の管理
 Azure Cloud Shell
 Office 365 / Microsoft 365 の管理
 Non-Microsoft Products の管理
 VMware vSphere (vCenter / ESXi) 等
Azure 等は PowerShell に依存しない管理コマンドも存在
 Azure CLI (az コマンド) (for Windows / macOS / Linux)
 Docker image
必ずしも PowerShell を使わないといけない、という訳ではない
PowerShell で実行可能なコマンド
 コマンドレット(Cmdlets)
 Pure powershell command
 エイリアス
 PowerShell の環境で定義されたエイリアス
 システム(デフォルト)定義とユーザ定義
 関数(Function)
 外部コマンド
オブジェクト
 コマンド(外部コマンド以外)の返り値はオブジェクト
 Get-Service
 $s = Get-Service
 $s.GetType()
 Object[]
 $s[0]
 $s[0].GetType()
 ServiceController
 Get-Service -Name wuauserv
 Get-Service -Name wuauserv | Stop-Service
 Get-Service -Name wuauserv
 (Get-Service -Name wuauserv).Start()
? と %
 ? : Where-Object の Alias
 オブジェクト(の配列)にフィルターをかける
 条件式が $true となるオブジェクト(の配列)を返す
 Get-Service | ? { $_.Status -eq "Running" }
 Get-Service | ? Status -eq "Running"
 % : ForEach-Object の Alias
 オブジェクトの配列を受け取り各要素に対して処理を実行する
 1..6 | % { Test-Connection -ComputerName 10.0.0.$_ -Count 1 -ErrorAction SilentlyContinue }
 $Error[0]
Sort
 sort : Sort-Object のエイリアス
 オブジェクトの配列を受け取り、指定したプロパティでソート
 複数プロパティを指定可能
 昇順・降順指定可能
 Get-Process
 Get-Process | Sort-Object -Property Id
 Get-Process | Sort-Object -Property WorkingSet –Descending
 Get-Process | Sort-Object -Property WorkingSet,CPU -Descending
 Get-Command sort -All
Select と uniq
 select : Select-Object の Alias
 オブジェクトの配列を受け取り
1. 特定のプロパティのみのサブセットに変換して返す
2. 先頭から or 末尾から指定した個数を返す
 Get-Process | Select-Object -Property ProcessName
 Get-Process | Sort-Object -Property WorkingSet -Descending | Select-Object -First 10
 Get-Unique
 オブジェクトの配列を受け取り、重複を排除して返す
 Get-Process | Sort-Object ProcessName | Select-Object ProcessName | Get-Unique –AsString
 Get-Process | Sort-Object ProcessName | Select-Object ProcessName -Unique
その他
 cat
 Get-Content
 grep
 Select-String -Path
 Select-String -Path C:¥Apps¥config.ini -Pattern "^[^#]“
 Get-Content -Path C:¥Apps¥config.ini | Select-String -Pattern "^[^#]“
 wc
 (Object[]).Length
 (Get-Process).Length
 (Get-Process).Count
-match と -replace
 演算子 -match
 文字列 -match 正規表現
 "abcde" -match "bc“
 "abcde" -match "Bc“
 "abcde" -cmatch "Bc"
 演算子 -replace
 文字列 -replace 正規表現 置換表現
 "abcde" -replace "abc","ABC“
 "abcde" -replace "aBc","ABC“
 "abcde" -creplace "aBc","ABC“
 "abcde" -replace "^.*(bc).*$",'$1‘
表示する
 ft : Format-Table の Alias
 表形式に整形して、テキストとして出力
 Get-ChildItem C:¥ | ft Name,Mode,LastWriteTime,Length
 fl : Format-List の Alias
 リスト形式に整形して、テキストとして出力
 Get-ChildItem C:¥ | fl Name,Mode,LastWriteTime,Length
組み合わせると…
 Get-Process -IncludeUserName | ? UserName -eq “user1" | Sort-Object -
Property WorkingSet -Descending | Select-Object -First 10 | ft
Id,ProcessName,@{Label="Mem(GB)";Expression={[int]($_.WorkingSet/1024
/1024)}}
 プロセス一覧を取得
 ユーザ名でフィルタ
 メモリ使用量で降順ソート
 上位10件を取得
 整形して表示
リモーティング
 いくつかの操作方法
 -ComputerName パラメータ
 Invoke-Command
 New-PSSession / Enter-PSSession
 Get-VM
 $cred = Get-Credential
 $pass = ConvertTo-SecureString "Password" -AsPlainText -Force
 $cred = New-Object System.Management.Automation.PsCredential "Administrator",$pass
 $s = New-PSSession -VMName win2016 -Credential $cred
 Get-PSSession
 Enter-PSSession $s
 hostname
 Get-PSSession | Remove-PSSession
どの層でリモート処理されているのか注意
PowerShell のリモーティングを使用する場合、Remoting のバージョン及び認証などに注意
PowerShell の使い方
 PowerShell らしい使い方
 なるべくオブジェクトのまま取り扱う
 出力する際に変換する
 テキストへの変換
 テキストの整形
PowerShell は遅い?
 遅い…かもしれないし、速いかもしれない
 「遅い」とは?
 基本的に、コードの実行については、他の言語
(スクリプトベースの言語)と大きな差異はない
 遅い(コストの高い)処理を多用するようなコードは遅い
 PowerShell 実行エンジンの初期化には、少し時間がかかる
 .NET Framework の実行環境を整えるのに時間がかかる
 Windows 10 Ver.1803 だとかなり改善されている
困ったときには
 Get-Help
 Get-Command
 -Syntax
 Get-Member
 Object.GetType()
[Appx.1] PowerShell を使う
 PowerShell Console
 PowerShell ISE
 Visual Studio Code
 PowerShell Gallery
 yum のリポジトリみたいなもの
 運営は Microsoft が行っているが、誰でも登録可能
 PowerShell DSC
 あるべき設定に実際の設定をあわせる機構
 Ansible みたいなもの
[Appx.2] コマンドが無い…時には
 .NET Framework のオブジェクトを直接操作
 例 ハッシュ取得
 WMI / CIM のオブジェクトを取得して操作
 例 OS設定変更

使ってみよう PowerShell

  • 1.
  • 2.
    PowerShell とは  シェル conhost 上でホストされる powershell.exe  Desktop / Server Core で利用可能  スクリプト言語  固有の言語体系・構文  固有のコマンド(コマンドレット)  スクリプト実行環境  powershell.exe を実行エンジンとしてスクリプトファイルを実行
  • 3.
    実は…  PowerShell には大きく2種類ある Windows PowerShell  PowerShell 1.0 ~ 5.1  Windows 専用 / Windows Server 2008 以降はビルトイン  .NET Framework 依存 / WMF の一部  PowerShell Core  PowerShell 6.0 ~  Windows / macOS / Linux  .NET Core 依存  互換性は、あったりなかったり  言語としては互換  ランタイムは(完全には)互換ではない
  • 4.
    PowerShell の特徴  オブジェクトベース 処理(パイプライン)を流れるのはオブジェクト  型がある・型を意識する  但し、デフォルトの設定だとかなり緩い  暗黙的にある程度型変換(キャスト)される  システム管理系のコマンドレットが充実している  Windows Server の管理作業はほぼ全て実行可能  概ね、Windows Server 2012 R2 以降  GUI の管理ツールは、裏で PowerShell のコマンドレットを実行
  • 5.
    何ができるか?  基本、何でもできる  Linuxのシェルでやっているような事  プロセス一覧で、特定ユーザのプロセスをフィルタして、メモリ使用量の高い順から10件分を表示  テキストを処理・整形して、特定の URL へ POST  ファイルのハッシュ値の計算  GUI を表示  ASDK Installer  .NET Framework のユーザインタフェースクラスのインスタンスを生成  イベントを監視して、イベントトリガーで処理を実行  特定のフォルダにファイルが置かれたら、zip圧縮  リモート処理  .NET Framework / Core のクラスを直接操作  WMI へのアクセス
  • 6.
    何に使うか?(得意な事)  Windows の管理 管理ツールのすべての操作は、基本的に実行可能  Azure の管理  Azure Cloud Shell  Office 365 / Microsoft 365 の管理  Non-Microsoft Products の管理  VMware vSphere (vCenter / ESXi) 等 Azure 等は PowerShell に依存しない管理コマンドも存在  Azure CLI (az コマンド) (for Windows / macOS / Linux)  Docker image 必ずしも PowerShell を使わないといけない、という訳ではない
  • 7.
    PowerShell で実行可能なコマンド  コマンドレット(Cmdlets) Pure powershell command  エイリアス  PowerShell の環境で定義されたエイリアス  システム(デフォルト)定義とユーザ定義  関数(Function)  外部コマンド
  • 8.
    オブジェクト  コマンド(外部コマンド以外)の返り値はオブジェクト  Get-Service $s = Get-Service  $s.GetType()  Object[]  $s[0]  $s[0].GetType()  ServiceController  Get-Service -Name wuauserv  Get-Service -Name wuauserv | Stop-Service  Get-Service -Name wuauserv  (Get-Service -Name wuauserv).Start()
  • 9.
    ? と % ? : Where-Object の Alias  オブジェクト(の配列)にフィルターをかける  条件式が $true となるオブジェクト(の配列)を返す  Get-Service | ? { $_.Status -eq "Running" }  Get-Service | ? Status -eq "Running"  % : ForEach-Object の Alias  オブジェクトの配列を受け取り各要素に対して処理を実行する  1..6 | % { Test-Connection -ComputerName 10.0.0.$_ -Count 1 -ErrorAction SilentlyContinue }  $Error[0]
  • 10.
    Sort  sort :Sort-Object のエイリアス  オブジェクトの配列を受け取り、指定したプロパティでソート  複数プロパティを指定可能  昇順・降順指定可能  Get-Process  Get-Process | Sort-Object -Property Id  Get-Process | Sort-Object -Property WorkingSet –Descending  Get-Process | Sort-Object -Property WorkingSet,CPU -Descending  Get-Command sort -All
  • 11.
    Select と uniq select : Select-Object の Alias  オブジェクトの配列を受け取り 1. 特定のプロパティのみのサブセットに変換して返す 2. 先頭から or 末尾から指定した個数を返す  Get-Process | Select-Object -Property ProcessName  Get-Process | Sort-Object -Property WorkingSet -Descending | Select-Object -First 10  Get-Unique  オブジェクトの配列を受け取り、重複を排除して返す  Get-Process | Sort-Object ProcessName | Select-Object ProcessName | Get-Unique –AsString  Get-Process | Sort-Object ProcessName | Select-Object ProcessName -Unique
  • 12.
    その他  cat  Get-Content grep  Select-String -Path  Select-String -Path C:¥Apps¥config.ini -Pattern "^[^#]“  Get-Content -Path C:¥Apps¥config.ini | Select-String -Pattern "^[^#]“  wc  (Object[]).Length  (Get-Process).Length  (Get-Process).Count
  • 13.
    -match と -replace 演算子 -match  文字列 -match 正規表現  "abcde" -match "bc“  "abcde" -match "Bc“  "abcde" -cmatch "Bc"  演算子 -replace  文字列 -replace 正規表現 置換表現  "abcde" -replace "abc","ABC“  "abcde" -replace "aBc","ABC“  "abcde" -creplace "aBc","ABC“  "abcde" -replace "^.*(bc).*$",'$1‘
  • 14.
    表示する  ft :Format-Table の Alias  表形式に整形して、テキストとして出力  Get-ChildItem C:¥ | ft Name,Mode,LastWriteTime,Length  fl : Format-List の Alias  リスト形式に整形して、テキストとして出力  Get-ChildItem C:¥ | fl Name,Mode,LastWriteTime,Length
  • 15.
    組み合わせると…  Get-Process -IncludeUserName| ? UserName -eq “user1" | Sort-Object - Property WorkingSet -Descending | Select-Object -First 10 | ft Id,ProcessName,@{Label="Mem(GB)";Expression={[int]($_.WorkingSet/1024 /1024)}}  プロセス一覧を取得  ユーザ名でフィルタ  メモリ使用量で降順ソート  上位10件を取得  整形して表示
  • 16.
    リモーティング  いくつかの操作方法  -ComputerNameパラメータ  Invoke-Command  New-PSSession / Enter-PSSession  Get-VM  $cred = Get-Credential  $pass = ConvertTo-SecureString "Password" -AsPlainText -Force  $cred = New-Object System.Management.Automation.PsCredential "Administrator",$pass  $s = New-PSSession -VMName win2016 -Credential $cred  Get-PSSession  Enter-PSSession $s  hostname  Get-PSSession | Remove-PSSession どの層でリモート処理されているのか注意 PowerShell のリモーティングを使用する場合、Remoting のバージョン及び認証などに注意
  • 17.
    PowerShell の使い方  PowerShellらしい使い方  なるべくオブジェクトのまま取り扱う  出力する際に変換する  テキストへの変換  テキストの整形
  • 18.
    PowerShell は遅い?  遅い…かもしれないし、速いかもしれない 「遅い」とは?  基本的に、コードの実行については、他の言語 (スクリプトベースの言語)と大きな差異はない  遅い(コストの高い)処理を多用するようなコードは遅い  PowerShell 実行エンジンの初期化には、少し時間がかかる  .NET Framework の実行環境を整えるのに時間がかかる  Windows 10 Ver.1803 だとかなり改善されている
  • 19.
    困ったときには  Get-Help  Get-Command -Syntax  Get-Member  Object.GetType()
  • 20.
    [Appx.1] PowerShell を使う PowerShell Console  PowerShell ISE  Visual Studio Code  PowerShell Gallery  yum のリポジトリみたいなもの  運営は Microsoft が行っているが、誰でも登録可能  PowerShell DSC  あるべき設定に実際の設定をあわせる機構  Ansible みたいなもの
  • 21.
    [Appx.2] コマンドが無い…時には  .NETFramework のオブジェクトを直接操作  例 ハッシュ取得  WMI / CIM のオブジェクトを取得して操作  例 OS設定変更