SeleniumBasicを起動すると、一時的にプロファイルフォルダを作成します。このフォルダはSeleniumBasicが起動する度に作成されます。通常、SeleniumBasicを正常に終了させればこの一時フォルダも消えるのですが、たまにこの一時フォルダが消えずに残る場合があります。何度もSeleniumBasicを起動すると大量に一時ファイルが溜まってしまい、Windowsドライブの容量を圧迫してしまいます。
Selenium起動を定期的に大量実行する場合、すぐに容量圧迫してしまうため、私はタスクスケジューラを利用し、一日に一回フォルダ削除しています。今回はこの一時ファイルの削除方法とタスクスケジューラ設定について解説してきたいと思います。
一時フォルダの保存場所
プロファイルの一時フォルダは、「C:\Users\ユーザ名\AppData\Local\Temp\Selenium」に保存されています。ユーザ名は、各PCで設定したユーザ名が入ります。この辺の検索が面倒な場合は、特殊フォルダをURL指定すれば該当のフォルダに移ります。shell:Local AppData\Temp\Selenium
ちなみに、記事作成時に当該フォルダの容量がどの程度あったか確認してみると、3GB以上の容量となっていました。
フォルダの削除
フォルダ削除は、手動で削除しても構いません。手動で削除する場合は、ゴミ箱を空にするのも忘れずに処理しましょう。また定期実行をしたい場合はVBAのFSO(FileSystemObject)やPowerShell等のスクリプトで定期実行すると、フォルダ内の一時ファイルが溜まる前にフォルダ削除ができる様になります。今回は、VBAとPowerShellの2つの方法でフォルダ削除方法を紹介します。
VBAによるフォルダ削除
VBAでフォルダ削除する場合、楽な方法はFSO(FileSystemObject)の利用です。以下でコードを紹介します。VBEの参照設定で、事前に「Microsoft Scripting Runtime」を選択しておきます。実行時バインディングでコード実行する場合は、fsoの変数宣言をDim fso As Objectへ変更します。2つの方法を各々コード紹介します。
ユーザ名のフォルダ名指定が面倒だったので、以下例では特殊フォルダを指定してユーザ名入力を省略する様に設定しています。
Private Sub FolderRemove_事前バインディング()
'VBEの参照設定で、事前に「Microsoft Scripting Runtime」を選択
Dim TempPath As String
TempPath = Environ("TEMP") & "\Selenium"
Dim fso As New FileSystemObject
If fso.FolderExists(TempPath) Then fso.DeleteFolder TempPath
End Sub
Sub FolderRemove_実行時バインディング()
Dim TempPath As String, fso As Object
TempPath = Environ("TEMP") & "\Selenium"
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FolderExists(TempPath) Then fso.DeleteFolder TempPath
End Sub
上記で作成したVBAは、以下フォルダを作成し、当該フォルダに保存しておきます。
C:\TaskScheduler\Selenium一時フォルダ削除
PowerShellによるフォルダ削除
PowerShellでフォルダ削除する場合はもっと簡単に設定できます。私は、Excelで表計算をする場合はVBAを利用し、Windows操作についてはPowerShellを利用しています。表計算の中でExcelVBAのFSOを利用する場合もあるのですが、今回は単純にフォルダを指定し、ファイル削除するだけですので敢えてExcelVBAを利用する必要性はありません。SeleniumBasicは直接表計算とは関係ありませんが、VBAによるデータ加工のしやすさから私は、ExcelVBAを利用してSeleniumを扱っています。どうせExcelで何かしら処理を施すのであれば、最初からExcelのプログラミング(VBA)でスクレイピングも処理した方が楽なため、という感じです。
また、大容量量のデータ処理の場合、FSOよりもPowerShellの方が高速に処理することができる場合が多いです。特にファイル検索はPowerShellの方が断然処理が速いです。PowerShellの使い方は以下ページを参照してください。
以下、コード紹介です。
$_LocalPath=[Environment]::GetFolderPath('LocalApplicationData')
$_Path = $_LocalPath + "\Temp\Selenium"
if (Test-Path $_Path) {Remove-item -Force -Recurse $_Path}
特殊フォルダは、Localパスを直接指定しています。Powershellの実行ファイルを保存します。今回は、Cドライブ直下に「C:\TaskScheduler」フォルダを作成し、そこにファイル名を「remove_folder.ps1」で保存します。
タスクスケジューラでファイル削除の定期実行
ファイル削除を定期実行するため、タスクスケジューラの実行方法を説明します。タスクスケジューラは、PowerShellやコマンドプロンプト、VBSといったシェルスクリプト等で実行が可能です。ExcelVBAはタスクスケジューラで直接実行はできないため、PowershellでExcelVBAの実行用コマンドを作成し、Powershell経由でExcelVBAを実行します。今回の一時ファイルの削除はPowerShellで作成していますので、最初にPowershellによるファイル削除ファイルをタスクスケジューラで実行する方法を紹介し、その後ExcelVBAによる方法を紹介します。
タスクスケジューラによるファイル定期削除(Powershell)
タスクスケジューラの起動方法はいくつかありますが、一番簡単な方法は、Windowsデスクトップの検索画面で「タスクスケジューラ」と、入力する方法です。
タスクスケジューラを起動すると以下の様な画面になっています。次に「タスクスケジューラ ライブラリ」をクリックします。
現在、タスクスケジューラで実行するリストが入っています。ChromeやEdgeのバージョンアップもこのタスクスケジューラで実行されていることが分かります。このリスト一覧に新たなタスクを作成します。画面右側メニューに「タスクの作成」がありますので、ここをクリックします。タブメニューの「操作」欄にも同様のメニューがあります。
「タスクの作成」画面が開きます。
全般設定では、以下4つ設定します。入力、選択後、「OK」ボタンをクリックします。
- タスク名を設定します。(RemoveSeleniumTempFolder)
- 「ユーザーが尾久恩しているときのみ実行する」を選択します。
- 「最上位の特権で実行する」のチェックボックスを付けます。
- OSがWindows10や11の場合、構成で「Windows10」を選択します。
次にトリガーの設定をします。定期実行のスケジュールをここで設定します。タブメニューの「トリガー」を選択し、「新規」ボタンをクリックします。
トリガー設定では、以下5つを設定します。設定後、「OK」ボタンをクリックします。
- 「スケジュールに従う」を選択します。
- 今回は「毎日」を選択します。週一の実行をしたい場合は、「毎週」を選択します。
- タスク実行の開始日を選択します。後日実行したい場合はその日付を選択します。
- 開始時間を選択します。毎日実行する場合ここで設定した時間で毎日実行されます。
- 停止するまでの時間を設定します。実行失敗時に備え、停止時間を設定します。
タスクのスケジュール設定が完了しました。
次に操作の設定をします。実行ファイルをここで設定します。タブメニューの「操作」を選択し、「新規」ボタンをクリックします。
操作設定では、以下3つの設定をします。設定後、「OK」ボタンをクリックします。
- WindowsPowerShellのexeファイルを指定します。WindowsPowerShellは、環境変数でパスが通っているため、「PowerShell」のみでOKです。
- フォルダ削除用のPowershellファイル(remove_folder.ps1)を絶対パスでフルパス指定します。フルパスの前に-Command を記入します。
-Command "C:\TaskScheduler\remove_folder.ps1" - 実行ファイルのフォルダパスを入力します。❷でフルパスを入力しているため、特に設定はしなくても実行可能です。
操作の設定が完了しました。これで設定は一通り完了したので、「OK」ボタンをクリックして設定を完了します。
タスクスケジューラのメニューにフォルダ削除用タスクが作成されました。
あとは、設定した時間にタスクが実行されます。または、当該のタスク名で右クリックすると、「実行する」ボタンがありますので、そこから即時実行することもできます。
タスクスケジューラによるファイル定期削除(VBA)
OfficeのVBAをタスクスケジューラで実行する場合は、Powershellを介して実行します。
実行手順は、「タスクスケジューラ」⇒「Powershell」⇒「VBA」の順番で実行するイメージです。ファイルの作成手順は、逆にVBAから作成することになります。事前に以下フォルダを作成しておきます。
C:\TaskScheduler\Selenium一時フォルダ削除
本ページの最初の方で作成したVBAですが、今一度掲載しておきます。今回は、FSO(事前バインディング)でファイル削除するマクロを利用します。ファイル保存場所は「C:\TaskScheduler\Selenium一時フォルダ削除」です。
Sub FolderRemove_事前バインディング()
'VBEの参照設定で、事前に「Microsoft Scripting Runtime」を選択
Dim ws As Object, UserPath As String, TempPath As String
Dim fso As New FileSystemObject
Set ws = CreateObject("WScript.Shell")
UserPath = Split(ws.SpecialFolders("Desktop"), "Desktop")(0)
TempPath = UserPath & "\AppData\Local\Temp\Selenium"
If fso.FolderExists(TempPath) Then fso.DeleteFolder TempPath
End Sub
PowershellでExcelマクロを実行できる様にファイル作成します。コード例は以下のとおりです。step1と同様、ファイル保存場所は「C:\TaskScheduler\Selenium一時フォルダ削除」です。
$filename = "C:\TaskScheduler\Selenium一時フォルダ削除\ファイル削除_FSO.xlsm"
$xlfile = $filename
$xl = New-Object -Com Excel.Application
$wb = $xl.Workbooks.Open($xlfile)
$xl.Visible = $true
$xl.Run("FolderRemove_事前バインディング")
$xl.DisplayAlerts = $false
$wb.Close()
$xl.DisplayAlerts = $true
#Excelアプリケーションを終了
$xl.Quit()
#COMオブジェクトの参照を解放
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($xl)
タスクスケジューラにてstep2で作成したPowershellファイルを実行します。タスクスケジューラの設定手順は、前項のPowershellによるファイル削除設定を参照して設定します。