HOME > PowerShell > Tips > その他

その他


作成日 2017年09月13日
更新日 2018年07月10日
  1. ファイルをダウンロードする(DownloadFile)
  2. クリップボードの表示と貼り付け(Get-Clipboard、Set-Clipboard)
  3. 今日の日付と今の時刻をクリップボードにコピーするショートカットファイルを作成する
  4. 日数を計算する(New-TimeSpan)
  5. データをグループ化する(Group-Object)
  6. 乱数を表示する(Get-Random)
  7. コマンドレットの結果をHTMLファイルとして保存する(ConvertTo-Html)
  8. グリッドビューで表示する(Out-GridView)
  9. エイリアスを設定する(Set-Alias)
  10. オブジェクトを作成する(New-Object)
  11. サービスを表示する(Get-Service)
  12. 文字列をコマンドとして実行する(Invoke-Expression)
  13. 別のプロセスで実行する(Start-Process)
  14. プロセスを停止する(Stop-Process)
  15. ウィンドウのタイトルの一覧を表示する(MainWindowTitle)
  16. コマンドの実行時間を計測する(Measure-Command)
  17. 確認のプロンプトを表示する(PromptForChoice)
  18. 指定した時間処理を中断する(Start-Sleep)
  19. プログレスバーを表示する(Write-Progress)
  20. イベント ログを表示する(Get-EventLog)
  21. 読み込んでいるアセンプリを表示する(GetAssemblies)
  22. 関数のソースを表示する(Definition)
  23. プロンプトを変更する(Prompt)
  24. PowerShellを管理者として実行したか?(Administrator)
  25. PSプロバイダーの一覧を取得する(Get-PSProvider)
  26. Windows PowerShell ISEのスニペットを作成する(New-IseSnippet)
  27. バージョンを表示する($PSVersionTable)

ファイルをダウンロードする(DownloadFile)

下記はユニコードの絵文字のDoCoMo、KDDI、SoftBankの対応するコードのファイルの「EmojiSources.txt」をダウンロードします。
[string]$URI = "http://www.unicode.org/Public/6.0.0/ucd/EmojiSources.txt"
[string]$FileName = Join-Path -Path $PWD "\EmojiSources.txt"
$WebClient = New-Object -TypeName Net.WebClient
$WebClient.DownloadFile($URI, $FileName);

クリップボードの表示と貼り付け(Get-Clipboard、Set-Clipboard)

下記はクリップボードのテキストを表示します。
Get-Clipboard

クリップボードのテキストを「a.txt」ファイルの最後に追加します。
Get-Clipboard | Add-Content -LiteralPath .\a.txt

下記は今日の日付をクリップボードにコピーします。例.2018年05月08日 火曜日
(Get-Date).ToString("yyyy年MM月dd日 dddd") | Set-Clipboard

下記はテキストファイルの「a.txt」をクリップボードにコピーします。
Get-Content -LiteralPath .\a.txt | Set-Clipboard

下記はクリップボードのテキストの各行の行頭にタブを連結します。
Get-Clipboard | ForEach-Object {"`t" + $_} | Set-Clipboard
クリップボードのテキストをインデントするショートカット ファイルを作成すると便利です。
ショートカット ファイルのプロパティのリンク先の値は下記のように入力します。(PowerShell.exeは自動でフルパス名になります)
PowerShell.exe -NoLogo -Command & {Get-Clipboard | ForEach-Object {\"`t\"+$_} | Set-Clipboard}
プロパティの「実行時の大きさ」を、「最小化」に選択するとウィンドウは表示されません。
ショートカット ファイルを作成するサンプルの「CreateShortcut.ps1」を参照してください。

下記はクリップボードのテキストの各行の行頭にシャープ記号(#)を連結します。PowerShellで、#以降はコメントです。
Get-Clipboard | ForEach-Object {"#" + $_} | Set-Clipboard

下記はクリップボードのテキストの行頭のシャープ記号(#)のみ削除します。
Get-Clipboard | ForEach-Object { ($_ -as [string]) -replace "^#", "" } | Set-Clipboard

このページの上

日数を計算する(New-TimeSpan)

下記はNew-TimeSpanコマンドレットで、2018/02/28から2018/03/02までの日数を計算します。
New-TimeSpan 2018/02/28 2018/03/02

下記は今年の1月1日から今日までの日数を計算します。
New-TimeSpan (Get-Date -Month 1 -Day 1) (Get-Date)

このページの上

データをグループ化する(Group-Object)

Group-Objectコマンドレットでデータをグループ化します。
下記はファイルの一覧を拡張子でグループ化します。
PS > Get-ChildItem | Group-Object Extension

Count Name                      Group                         
----- ----                      -----                         
    2                           {Backup, Image}        
    9 .txt                      {a.txt, Alias.txt, b.txt, F.txt...}
    2 .ps1                      {Alias.ps1, sample.ps1}       
    1 .csv                      {FileList.csv}                
    1 .html                     {FileList.html}
Countプロパティはファイルの数、Nameは拡張子です。

このページの上

乱数を表示する(Get-Random)

Get-Randomコマンドレットで乱数を表示します。
Minimumパラメーターに最小値を、Maximumパラメーターに最大値に1を足した数を指定します。
下記は1から6までの整数を表示します。
Get-Random -Minimum 1 -Maximum 7

このページの上

コマンドレットの結果をHTMLファイルとして保存する(ConvertTo-Html)

下記はGet-ChildItemコマンドレットの結果をHTMLに変換して、ファイル「a.html」に保存します。
Get-ChildItem -Path *.ps1 -File | ConvertTo-Html | Out-File .\a.html

このページの上

グリッドビューで表示する(Out-GridView)

グリッドビューに出力し、整列、抽出できます。
-PassThruパラメーターで、選択した項目を取得します。
下記はGet-ChildItemコマンドレットの結果をグリッドビューで表示します。
Get-ChildItem | Out-GridView -PassThru
GridView
「OK」ボタンを実行すると、選択した項目を取得します。

下記はプロセスのコマンドラインを「CommandLine」列で確認できます。
Get-WmiObject Win32_Process | Out-GridView

このページの上

エイリアスを設定する(Set-Alias)

コマンドレットのエイリアス(別名)を設定するには、Set-Aliasコマンドレットです。
エイリアスがまだ存在しない場合は作成します。
エイリアスの一覧を取得するにはGet-Aliasコマンドレットです。
エキスポートするにはExport-Alias、インポートするにはImport-Aliasコマンドレットです。
プロファイルで実行すれば起動時に自動でエイリアスを設定します。
エイリアスはコマンドレットのみで、パラメーターを含める事はできません。パラメーターも必要ならスクリプトファイルにしてください。
下記は「Get-Date」コマンドレットを、エイリアスの「Now」に設定します。
Set-Alias -Name Now -Value Get-Date

下記は「Get-Content」コマンドレットを、エイリアスの「<」に設定します。
Set-Alias -Name "<" -Value Get-Content
実行する時は < の後にスペースを入力してファイルを名を指定します。
「.\a.txt」ファイルを表示するには、「< .\a.txt」です。
コマンド プロンプトの入力の記号の < は将来のために予約されています。

エイリアスを新規作成するには、New-Aliasコマンドレットですが、既に存在するとエラーになります。私はSet-Aliasを使います。

パスを指定しないで名前が重複した場合の実行する優先順位は下記です。
  1. エイリアス
  2. 関数
  3. コマンドレット
  4. ネイティブ コマンド

このページの上

オブジェクトを作成する(New-Object)

下記はフォームを表示します。
Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object -TypeName System.Windows.Forms.Form
$ModalResult = $Form.ShowDialog()

下記はメッセージを表示して、3秒後に閉じます。
$WS = New-Object -ComObject WScript.Shell
$WS.Popup("メッセージを表示して、3秒後に閉じます。", 3, "ポップアップ ウィンドウ", 0)

このページの上

サービスを表示する(Get-Service)

Get-Serviceコマンドレットでサービスの一覧を取得します。
Get-Service

下記はサービスの「Windows Defender」をリスト形式で表示します。
PS > Get-Service WinDefend | Format-List

Name                : WinDefend
DisplayName         : Windows Defender Antivirus Service
Status              : Running
DependentServices   : {}
ServicesDependedOn  : {RpcSs}
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True
ServiceType         : Win32OwnProcess

このページの上

文字列をコマンドとして実行する(Invoke-Expression)

下記はメモ帳で「.\a.txt」ファイルを開きます。
$Command = "Notepad.exe"
$ArgumentList = ".\a.txt"
$CmdLine = "$Command $ArgumentList"
Invoke-Expression -Command $CmdLine

このページの上

別のプロセスで実行する(Start-Process)

下記は別のプロセスでインターネット エクスプローラの「C:\Program Files\Internet Explorer\IExplore.exe」を実行します。
Start-Process -FilePath IExplore.exe
「IExplore.exe」はレジストリのHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Pathsキーの子のキーにあります。

下記は別のプロセスで「Microsoft Edge」を実行します。
Start-Process -FilePath Shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge

下記は別のプロセスで特殊フォルダの「送る」を開きます。
Start-Process -FilePath Shell:SendTo

下記は別のプロセスでWindows PowerShellを管理者として実行します。
Start-Process -FilePath PowerShell.exe -Verb RunAs

このページの上

プロセスを停止する(Stop-Process)

Stop-Processコマンドレットの-Idか、-Nameパラメーターを指定してプロセスを停止します。
下記のどちらも「電卓」を停止します。
Get-Process -Name Calculator | Stop-Process
Stop-Process -Name Calculator

このページの上

ウィンドウのタイトルの一覧を表示する(MainWindowTitle)

下記は開いているメイン ウィンドウのタイトルの一覧を表示します。
Get-Process | Where-Object {$_.MainWindowHandle -ne 0} | Select-Object {$_.MainWindowTitle}

このページの上

コマンドの実行時間を計測する(Measure-Command)

下記はGet-ControlPanelItemコマンドレットの実行時間を計測します。
PS > Measure-Command { Get-ControlPanelItem }

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 2
Milliseconds      : 241
Ticks             : 22416401
TotalDays         : 2.59449085648148E-05
TotalHours        : 0.000622677805555556
TotalMinutes      : 0.0373606683333333
TotalSeconds      : 2.2416401
TotalMilliseconds : 2241.6401

このページの上

確認のプロンプトを表示する(PromptForChoice)

ここで紹介するのは$Host.UIのPromptForChoiceメソッドを使用する方法です。
選択肢を表示し、選択した項目の0始まりの数値を返します。
確認プロンプトは高度な関数で$PSCmdletのShouldProcessメソッドを使用する方法もあります。
# PowerShell ISEの場合のアンパーサンド記号の(&)の次の半角の英数字はアクセスキーです。
$Yes = New-Object System.Management.Automation.Host.ChoiceDescription("はい(&Y)","ファイルに保存します。")
$No  = New-Object System.Management.Automation.Host.ChoiceDescription("いいえ(&N)","ファイルに保存しません。")
$Choice = [System.Management.Automation.Host.ChoiceDescription[]]($Yes,$No)
# 選択肢の既定は0を指定したので「はい(Y)」です。
$Ans = $Host.UI.PromptForChoice("確認","ファイルに保存しますか?",$Choice,0)
# 入力の文字の大文字と小文字は区別しません。
# 選択を中断するにはPowerShellはCtrl+Cキー、PowerShell ISEはESCキーです。

Write-Host "`$Ans = $Ans"
if ($Ans -eq 0) {
    Write-Output "はい"
} elseif ($Ans -eq 1) {
    Write-Output "いいえ"
} else {
    Write-Output "ありえません。"
}

PowerShellはメッセージを文字列で表示します。選択肢の既定の文字色は黄色になります。
確認
ファイルに保存しますか?
[Y] はい(Y)  [N] いいえ(N)  [?] ヘルプ (既定値は "Y"):
Ans = 0
はい

PowerShell ISEはメッセージをダイアログで表示します。
確認のダイアログ

このページの上

指定した時間処理を中断する(Start-Sleep)

Start-Sleepコマンドレットで指定した時間処理を中断します。
パラメーターの-Secondsは秒、-Millisecondsはミリ秒を指定します。
下記のいずれも1秒間処理を中断します。
Start-Sleep -Seconds 1
Start-Sleep -Milliseconds 1000

このページの上

プログレスバーを表示する(Write-Progress)

Write-Progressコマンドレットのパラメーターの-Activityは1行目、-Statusは2行目のメッセージで、-PercentCompleteは完了したパーセントです。
for ($I = 1; $I -le 100; $I++ ){
    Start-Sleep -Milliseconds 50
    Write-Progress -Activity "実行中..." -Status "$I% 完了" -PercentComplete $I
}
メッセージに「。」を指定しないが表示されます。
プログレスバー

このページの上

イベント ログを表示する(Get-EventLog)

Get-EventLogコマンドレットでイベント ログを表示します。
下記は、-Listパラメーターでログ名の一覧を表示します。
PS > Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Log
  ------ ------ --------------        ------- ---
  20,480      0 OverwriteAsNeeded      18,819 Application
  20,480      0 OverwriteAsNeeded           0 HardwareEvents 
     512      7 OverwriteOlder              0 Internet Explorer
  20,480      0 OverwriteAsNeeded           0 Key Management Service
     128      0 OverwriteAsNeeded          59 OAlerts
     512      7 OverwriteOlder              0 PreEmptive
                                              Security
  20,480      0 OverwriteAsNeeded      11,912 System
     512      7 OverwriteOlder              0 Windows Azure
  15,360      0 OverwriteAsNeeded       4,902 Windows PowerShell

下記はシステムの最新の10個のログを表示します。
Get-EventLog -LogName System -Newest 10

下記はシステムの最新の5個のログを詳細に表示します。
Get-EventLog -LogName System -Newest 5 | Format-List

下記はWindows PowerShellのすべてのイベント ログをクリアーします。Windows PowerShellは管理者として実行してください。
Clear-EventLog -LogName 'Windows PowerShell'

このページの上

読み込んでいるアセンプリを表示する(GetAssemblies)

[System.AppDomain]::CurrentDomain.GetAssemblies()で、読み込んでいるアセンプリを表示します。
[System.AppDomain]::CurrentDomain.GetAssemblies()
GAC    Version        Location
---    -------        --------
True   v4.0.30319     C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
False  v4.0.30319     C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
GACはGlobal Assembly Cashの略です。
もっと表示されますが省略します。

下記は整列して読み込んでいるアセンプリの名前のみ表示します。
[System.AppDomain]::CurrentDomain.GetAssemblies() | ForEach-Object { $_.GetName().Name } | Sort-Object

下記は整列して読み込んでいるアセンプリの長い名前で表示します。
[System.AppDomain]::CurrentDomain.GetAssemblies() | ForEach-Object { $_.FullName } | Sort-Object

下記のいずれも「Microsoft.VisualBasic」をロードします。
Add-Type -AssemblyName Microsoft.VisualBasic
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") > $null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null
[void]、あるいは標準出力を$nullにリダイレクトすると、メッセージを表示しません。

下記はSystem.Management.Automation.dllのフルパス名を表示します。
PS > ([System.Reflection.Assembly]::LoadWithPartialName("System.Management.Automation")).Location
C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll

このページの上

関数のソースを表示する(Definition)

下記のどちらもPrompt関数のソースを表示します。(関数によっては表示できません)
Get-Content -LiteralPath Function:\Prompt

(Get-Item -LiteralPath Function:\Prompt).Definition

下記は現在の関数の一覧を表示します。
Get-ChildItem Function:

このページの上

プロンプトを変更する(Prompt)

プロンプトを変更するにはPrompt関数を変更します。
function Prompt {
    $Host.UI.RawUI.WindowTitle =  Get-Location # ウィンドウのタイトルにカレント ディレクトリを表示します。
    Write-Host ((Get-Date).ToString("hh:mm:ss.fff") + ' >') -ForegroundColor Black -BackgroundColor Gray -NoNewline # プロンプトに時刻を表示します。
    ' ' # 戻り値がないと、プロンプトは「PS> 」が表示されます。
}
上の関数を実行すると、プロンプトは灰色の背景に黒字の文字で時刻を表示します。ウィンドウのタイトルにカレント ディレクトリを表示します。
プロンプト

起動時にプロンプトを変更するにはプロファイルに設定してください。

このページの上

PowerShellを管理者として実行したか?(Administrator)

下記の関数はPowerShellを管理者として実行した場合はTrueを返します。
Function IsAdministrator(){
    $WindowsIdentity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $WindowsPrincipal = [Security.Principal.WindowsPrincipal] $WindowsIdentity
    Return ($WindowsPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
}

このページの上

PSプロバイダーの一覧を取得する(Get-PSProvider)

「Get-PSProvider」コマンドレットで表示します。
Name                 Capabilities                                                                             Drives
----                 ------------                                                                             ------
Registry             ShouldProcess, Transactions                                                              {HKLM, HKCU, HKCR, HKU}
Alias                ShouldProcess                                                                            {Alias}
Environment          ShouldProcess                                                                            {Env}
FileSystem           Filter, ShouldProcess, Credentials                                                       {C, D, E, F}
Function             ShouldProcess                                                                            {Function}
Variable             ShouldProcess                                                                            {Variable}
Certificate          ShouldProcess                                                                            {Cert}
WSMan                Credentials                                                                              {WSMan}

このページの上

Windows PowerShell ISEのスニペットを作成する(New-IseSnippet)

New-IseSnippeコマンドレットで、Windows PowerShell ISEの「編集」の「スニペットの開始」メニューに項目を追加します。
-Descriptionパラメーターは説明を、-Textは挿入する文字列を、-Titleはタイトルを、 -Authorに作者名を指定します。
-Titleパラメーターでファイル名に使用できない特殊記号は下線の_に変換したファイル名になります。
下記はダラー記号($)を含むので、一重引用符(')で囲みました。
$Text=@'
filter Verb-Noun{
    "#" + $_
}
'@
New-IseSnippet -Description filterの例 -Text $Text -Title filter -Author Suzuki
ファイルは「$Home\Documents\WindowsPowerShell\Snippets」フォルダに、拡張子が「.snippets.ps1xml」の -Titleパラメーターで指定した名前で作成されます。
スニペットの変更、削除する場合はこのファイルを操作します。

Get-IseSnippetコマンドレットで、自作したスニペットの一覧を表示します。
Get-IseSnippet

下記はスニペットのファイルがあるフォルダを開きます。
Invoke-Item $HOME\Documents\WindowsPowerShell\Snippets

このページの上

バージョンを表示する($PSVersionTable)

シェル変数の「$PSVersionTable」で表示します。
Name                           Value
----                           -----
PSVersion                      5.1.150
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2
BuildVersion                   10.0.15
CLRVersion                     4.0.303
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

「$PSVersionTable["PSVersion"]でバージョンのみ表示します。
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      15063  502     

「Get-Host」コマンドレットもバージョンを表示します。(Windows PowerShellで実行)
Name             : ConsoleHost
Version          : 5.1.15063.502
InstanceId       : bd9a12bb-dd9e-408b-9455-8e457fc3d3a3
UI               : System.Management.Automation.Internal.Host.InternalH
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

「Get-Host」コマンドレットもバージョンを表示します。(Windows PowerShell ISEで実行)
Name             : Windows PowerShell ISE Host
Version          : 5.1.15063.502
InstanceId       : 0cd70dbe-7126-49cb-9622-dc97f6aa407c
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.Host.ISE.ISEOptions
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

このページの上