Powershellスクリプトで操作/作業ログを記録する①

Python

作成経緯について

2023年5月に部署異動があり、新しい環境で働き始めました。
新しい部署での作業を可視化して作業効率を上げるために、Windows端末の操作ログを取得することにしました。
ただ、新しい部署ではISMSの関係上、Windows端末にアプリを自由に入れることはできません。
WindowsOSの基本機能で操作/作業ログを取得する方法を検討し、Powershellで操作ログを取得することにしました。

スクリプトの概要

スクリプトはPowershellで作成されています。
WindowsOSに標準インストールされているPowershellで実行でき、追加のライブラリなどはありません。記載の手順でスクリプトを実行すると、バックグラウンドで動作するので、画面には何も表示されません。
スクリプトを実行すると、1秒間隔でアクティブになっているウィンドウ名とそのプロセス名を取得してCSVファイルに記録します。スクリプトを停止すると、HTML形式の操作ログレポートを出力します。

ファイル・フォルダの構成と内容

ファイル・フォルダ構成は下記なります。
        get_operation_log
                │  get_operation_log.ps1
                │  LICENSE
                │  README.md
                ├─log
                |    yyyymmdd_history.csv
                |    exec_flag.txt
                |    exec_log.txt
                └─report
                     template_report.html
                     yyyymmdd_report.html
ファイル・フォルダの内容は下記となります。
ファイル・フォルダ 内容
get_operation_log ルートディレクトリ
LICENSE ライセンス情報を記入したファイル(MITライセンス)
README.md 実行方法やファイルの中身の説明
log ログ関連を保存するフォルダ
yyyymmdd_history.csv 取得した情報を保存するCSVファイル
exec_flag.txt スクリプトを実行すると生成されるファイル
exec_log.txt スクリプトの実行ログを保存するファイル
report レポートを保存するフォルダ
template_report.html レポートを作成する際に使用するテンプレート用HTMLファイル
yyyymmdd_report.htm 操作履歴をまとめたHTML形式のファイル

生成されるファイル

生成されるファイルのファイルタイプと内容は下記となります。
ファイル名 ファイルタイプ 内容
yyyymmdd_history.csv CSVファイル yyyymmdd HH:MM:SS,アプリケーションのプロセス名,ウィンドウタイトル名
exec_flag.txt テキストファイル スクリプトを実行したプロセス番号
exec_log.txt テキストファイル yyyymmdd HH:MM:SS メッセージ
yyyymdd_report.html HTMLファイル 操作履歴の情報

yyyymmdd_report.htmlの詳細

HTML形式のレポートで確認できる内容は下記となります。
項目名 表示形式 表示内容
作業履歴の取得環境 ユーザ名,ドメイン名,コンピューター名,OS名,OSバージョン
アプリケーションの使用時間 表と棒グラフ アプリケーション名,表示時間(分)
アプリケーションの使用割合 円グラフ アプリケーション名,使用割合(%)
時間あたりのアプリケーション使用率 100%積上げグラフ アプリケーション名,使用割合(%)
ウィンドウごとの表示時間 ウィンドウ名,表示時間(秒)
<yyyymdd_report.htmlのサンプル>

設定変更できる内容

設定変更できる内容は下記となります。
変数名 設定内容 初期値
$log_folder ログを保存するパス “./log/”
$report_folder レポートを保存するパス “./report/”
interval 作業履歴を取得する間隔 950
$time_stop_script スクリプトを停止する時刻 “19:00”
作業履歴を取得する間隔を調整する`interval`はミリ秒単位です。
作業履歴を取得する端末の負荷が高いと1秒おきに作業履歴を取得できない場合があります。その際は、`interval`の値で作業履歴を取得する処理の間隔を調整してください。

作成したスクリプト

操作/作業ログを取得するスクリプト:get_operation_log.ps1

<#
 操作ログ(クティブになっているウィンドウのプロセス名とアクティブ名)を指定した秒間隔で取得し、 ログに出力する
 プログラムの終了時に取得した操作ログでhtml形式のレポートを作成する
 実行方法: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -File get_operation_log.ps1
 ログのフォーマット: yyyy/mm/dd HH:MM:SS, プロセス名,ウィンドウ名
 ログの出力先: $log_folderで設定
 ログのサイズ: 1時間で約800KB 8時間で約7MB
 レポート作成先: $report_folder で設定

 Version: 1.0.0
 Last Updated: 2023/6/11
#>

#---------#
# 変数定義 #
#---------#

# logフォルダのパス
$log_folder = "./log/"

#プログラムの実行履歴を記録するファイル
$exec_logfile = $log_folder + "exec_log.txt"

#作業履歴情報を記録するファイル
$history_file_name = (Get-Date -UFormat "%Y%m%d") + "_" + "history.csv"
$history_file = $log_folder + $history_file_name

#実行フラグのファイル
$exec_flag_file = $log_folder + "exec_flag.txt"

# カラーリスト
$color_list = "#D3D3D3","#7B68EF", "#87CFEB","#40E0D0","#3CB371","#ADFF2F","#BA55D3","#CD5C5C","#FF82EE","#FFA07AFFA500 #FFD700","#FFF8DC","#FFEBCD","#00008B", "#191970#483D8B", "#4B0082","#0000CD #7868EE", "#4169E1","#6495ED"

# 作業履歴情報のファイル名から日付を抽出する
$report_date = $history_file_name.Substring(0,8)

# レポートを保存するフォルダのパス
$report_folder = "./report/"

# レポートを作成するためのテンプレートと作成後のファイルを指定する
$template_report = $report_folder + "template_report.html"
$report = $report_folder + $report_date + "_report.html"

# 作業履歴を取得する間隔、単位はミリ秒
$interval = 950

# scriptを停止する時刻
$time_stop_script = "19:00"

#---------#
# 関数定義 #
#---------#

# スクリプトの実行環境のチェック
# 引数:無し
# 戻値:無し
function check_exec_env(){
	# ログを保存するフォルダの確認
	if(Test-Path $log_folder){
		logging("ログを保存するフォルダは存在しています。")
	}else{
		logging("ログを保存するフォルダが存在していません。ログフォルダを作成します。")
		New-Item $log_folder -ItemType Directory
	}
	# レポートを保存するフォルダの確認
	if(Test-Path $report_folder){
		logging("レポートを保存するフォルダは存在しています。")
	}else{
		logging("レポートを保存するフォルダが存在していません。reportフォルダを作成してtemplate_report.htmlを配置してください。")
	}
}

# プログラム実行状況を確認する関数
# 引数:無し
# 戻値:無し
function check_program_execution(){
	# アセンブリを読み込む
	Add-Type -AssemblyName System.Windows.Forms
	#実行フラグの有無を確認する
	if(Test-Path $exec_flag_file){
		logging("実行フラグが存在しています。作業履歴を取得中です。")
		$result = [System.Windows.Forms.MessageBox]::Show("作業履歴取得スクリプトは稼働しています。`r`n`r`n作業履歴取得スクリプトを終了しますか?","作業履歴取得スクリプトの動作確認", "YesNo", "Warning")
		if( $result -eq "Yes" ){
			#プログラムの終了処理を実行する
			termination_process
		}
	}else{
		logging("作業履歴の取得を開始します。")
		Write-Output $pid | Out-File $exec_flag_file -Append
	}
}

#プログラム終了時の処理を行う関数
# 引数:無し
# 戻値:無し
function termination_process(){
	# 作業履歴からレポートを作成する
	# 作業履歴を読み込む
	$csv_data = Import-Csv $history_file -Header time, Name, MainWindowTitle

	#ログの1行目の時刻と最終行の時刻を取得する
	$time = get_first_last_time $csv_data
	
	#単位時間あたりのアプリ起動回数を取得し、 $Collectedに保存する
	$Collected = get_num_AppLaunches $csv_data $time[0] $time[1]

	#作業履歴取得の環境情報の表を作成する
	create_info_environment

	#アプリケーションの使用割合(円グラフ)と使用時間(棒グラフ)、ウィンドウごとの表示時間(表)を作成する
	create_pie_bar_chart_tables $csv_data

	# 時間あたりのアプリケーション使用率 (100%積み上げグラフ)を作成する 
	create_stacked_chart $Collected $time[0] $time[1]

	# アプリごとの使用時間の表を作成する
	create_usage_time_per_app $Collected $time[0] $time[1]

	#プログラムを終了する
	terminate_program
}

#プログラムを終了する関数
# 引数:無し
# 戻値:無し
function terminate_program(){
	#終了させるプロセスIDを取得する
	$read_pid = Get-Content $exec_flag_file -Raw

	# 実行フラグを削除する
	Remove-Item $exec_flag_file

	#ログに終了メッセージを書き込んでプログラムを終了する
	logging("プログラムを終了します。 ")
	Stop-Process -Id $read_pid
	Stop-Process -Id $pid
}

#アプリケーションの使用割合 (円グラフ)と使用時間(棒グラフ)、ウィンドウごとの表示時間(表)を作成する関数
# 引数:作業履歴のデータ (object)
# 戻値:無し
function create_pie_bar_chart_tables($csv_data){
	logging ("アプリケーションの使用割合(円グラフ)と使用時間(棒グラフ)、 ウィンドウごとの表示時間(表)の作成を開始します。")

	#円グラフのカラーリスト
	$colors=""

	#Name、MainWindowTitleを保持する配列
	$Name = @()
	$MainWindowTitle = @()
	
	# 読み込んだCSVファイルからName、 MainWindowTitleをそれぞれ抽出する
	foreach ($history in $csv_data) { 
		$Name += $history.Name
		$MainWindowTitle += $history. MainWindowTitle
	}

	#Name、MainWindowTitleの統計情報を取得する
	$statistics_N = $Name | Group-Object -NoElement | Sort-Object -Property Count
	$statistics_MWT = $MainWindowTitle | Group-Object -NoElement | Sort-Object -Descending -Property Count

	#Nameの統計情報を保存する変数
	$statistics_N_Name = ""
	$statistics_N_Count = ""

	for($i=0; $i -lt $statistics_N.Length; $i++){
		$statistics_N_Name = '"' + $statistics_N[$i].Name + '"' + "," + $statistics_N_Name 
		$statistics_N_Count = [string] $statistics_N[$i].count + "," + $statistics_N_Count
		$colors = '"' + $color_list[$i] + '"' + "," + $colors
	}

	#MainWindowTitleの統計情報をtableタグ形式に変換する
	$tables_active = @()
	for ($i=0; $i -lt $statistics_MWT.Length; $i++){
		$tables_active += " <tr><td>" + $statistics_MWT[$i].Name + "</td>" + "<td>" + $statistics_MWT[$i].count + "</td>" + "</tr>" + "`r`n"
	}
	
	#テンプレートに値を反映する。 反映するのは日付、 ラベル、 データ、カラー、表
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "yyyymmdd",$report_date } | Set-Content -Encoding UTF8 $report
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "Name",$statistics_N_Name } | Set-Content -Encoding UTF8 $report
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "Count",$statistics_N_Count } | Set-Content -Encoding UTF8 $report
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "Colors",$colors } | Set-Content -Encoding UTF8 $report 
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "tables_active",$tables_active } | Set-Content -Encoding UTF8 $report
}

# 時間あたりのアプリケーション使用率 (100% 積み上げグラフ)を作成する関数
# 引数: 単位時間あたりのアプリ起動回数のオブジェクト (object), ログ1行目の時刻(int), ログ最終行の時刻(int)
# 戻値: 無し
function create_stacked_chart($Collected, $first_time_zone, $last_time_zone){ 
	logging("時間あたりのアプリケーション使用率 (100%積み上げグラフ)の作成を開始します。")
	#開始時刻と終了時刻からlabelsを設定する
	$labels = "        labels: ["
	for($i=$first_time_zone; $i -le $last_time_zone; $i++){
		$labels += '"' +[string] $i + "時" + '"' + ","
	}
	$labels += "],"

	#100%棒グラフを表示するためのhtmlを設定する
	$tmp=""
	$process = ""
	$datasets = "        datasets: [`r`n"
	
	for($i=0; $i -lt $Collected.Name.Count; $i++){
		for($j=$last_time_zone; $j -ge $first_time_zone; $j--){
			$tmp = [string]$Collected.$j[$i] + "," + $tmp
		}
		$process += "        process[" + [string]$i + "] = ["+ $tmp + "];`r`n"
		$tmp = ""
		$datasets += "        {`r`n" + "          label:""" + $Collected.Name[$i] + """,`r`n" + "          data: ratio[" + [string]$i + "],`r`n" + "          backgroundColor:[""" + $color_list[$i] + """],`r`n" + "        },`r`n"
	}
	$datasets += "        ],"

	#開始から終了までの時間
	$times = $last_time_zone - $first_time_zone

	#テンプレートに値を反映する。 反映するのは各アプリの時間あたりの使用数、時間、
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "_PROCESS_",$process } | Set-Content -Encoding UTF8 $report 
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "_TIMES_",$times} | Set-Content -Encoding UTF8 $report
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "_NUM_APPS_",$Collected.Name.Count } | Set-Content -Encoding UTF8 $report 
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "_LABELS_",$labels } | Set-Content -Encoding UTF8 $report 
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "_DATASETS_",$datasets } | Set-Content -Encoding UTF8 $report
}

# アプリごとの利用時間の表を作成する関数
# 引数:作業履歴のデータ(object)
# 戻値:無し
function create_usage_time_per_app($Collected, $first_time_zone, $last_time_zone){
	logging ("アプリケーションごとの利用時間表の作成を開始します。")
	#アプリごとの利用時間を分単位で連想配列に保存する
	$list = @{}
	for($i=0; $i -lt $Collected.Name.Count; $i++){
		for($j=$first_time_zone; $j -le $last_time_zone; $j++){
			$count += $Collected."$j"[$i]
		}
		$count = [Math]::Round($count / 60, 1)
		$list.Add($Collected.Name[$i], $count)
		$count = 0
	}

	#利用時間で降順に並び替える
	$list = $list.GetEnumerator() | Sort-Object -Property Value -Descending

	#アプリごとの利用時間をtableタグ形式に変換する 
	$tables_apps = @()
	foreach($entry in $list.GetEnumerator()){
		$tables_apps += "      <tr><td>" + $entry.Name + "</td>" + "<td>" + $entry.Value + "</td>"+"</tr>" + "`r`n"
	}
	
	#テンプレートに値を反映する。 反映するのは各アプリの使用時間
	(Get-Content -Encoding UTF8 $report) | ForEach-Object { $_ -replace "tables_apps", $tables_apps } | Set-Content -Encoding UTF8 $report
}

# ログの1行目の時刻と最終行の時刻を取得する関数
# 引数:作業履歴のデータ(object)
# 戻値:ログの1行目の時刻(int)と最終行の時刻(int)
function get_first_last_time($csv_data) {
	logging ("ログの1行目の時刻と最終行の時刻の取得を開始します。")

	#ログの1行目の時刻を取得する
	$first_time = $csv_data.time[0] 
	$first_time_zone = [int]$first_time.Substring(11,2)

	#ログの最終行の時刻を取得する
	$last_time = $csv_data.time[-1]
	$last_time_zone = [int]$last_time.Substring(11,2)

	return $first_time_zone, $last_time_zone
}

# 単位時間あたりのアプリ起動回数を取得する関数
# 引数:作業履歴のデータ(object), ログ1行目の時刻(int), ログ最終行の時刻(int)
# 戻値: 単位時間あたりのアプリ起動回数のオブジェクト (object)
function get_num_AppLaunches($csv_data, $first_time_zone, $last_time_zone){
	logging ("単位時間あたりのアプリ起動回数の取得を開始します。") 
	#起動していたアプリの一覧を取得する
	$app_list = $csv_data | Select-Object -Property Name -Unique

	# 時間帯の情報を保存する空の配列を用意
	$Collected = New-Object System.Collections.ArrayList

	# 時間帯の各アプリの記録頻度をカウントする
	foreach ($app in $app_list) {
		# 初期値を設定
		$time_zone = $first_time_zone
		$count = 0 
		# $count_times_per_hour = @()

		# カスタムオブジェクトを作成する
		$Property = New-Object -TypeName PSObject

		#カスタムオブジェクトにNameプロパティを作成してアプリ名を加える 
		$Property | Add-Member -Type NoteProperty -Name 'Name' -Value $app.Name

		#各時間帯のアプリごとの利用回数を抽出する 
		while ($time_zone -le $last_time_zone){
			# 0埋め2桁表示
			$s ='{0:00}' -f $time_zone

			#時間帯ごとのログを抽出する
			$pattern = '' + [string] $s + ':'
			$csv_select = $csv_data | Select-Object | Where-Object {$_.time -match $pattern }
			
			#notepad++をカウントするときは正規表現で一致させる
			if( $app.Name -eq 'notepad++'){
				$count = $csv_select | Select-Object | Where-Object {$_.Name -match ("^" + 'notepad[`+][`+]' + "$")} | Measure-Object
				$Property | Add-Member -Type NoteProperty -Name $time_zone -Value $count.Count
			}else{
				#notepad++以外のアプリをカウントする
				$count = $csv_select | Select-Object | Where-Object {$_.Name -match ("^" + $app.Name + "$")} | Measure-Object
				$Property | Add-Member -Type NoteProperty -Name $time_zone -Value $count.Count
			}
			$time_zone += 1
		}
		#オブジェクトに追加
		$Collected.add($Property)
	}
	return $Collected
}

#作業履歴取得の環境情報の表を作成する関数
# 引数:無し
# 戻値:無し
function create_info_environment(){
	logging("作業履歴取得の環境情報の表の作成を開始します。")
	# ユーザー名、ドメイン名、コンピューター名、OS名、 OSバージョンを取得する
	$username = $env:username
	$domain = $env:USERDOMAIN
	$computername = $env:COMPUTERNAME
	$osname = (Get-ComputerInfo).osname
	$osversion = (Get-ComputerInfo).osversion
			
	#テンプレートに値を反映する。 反映するのは作業履歴の取得環境の情報
	$tables_info = "      <tr><td>" + $username + "</td><td>" + $domain + "</td><td>" + $computername + "</td><td>" + $osname + "</td><td>" + $osversion + "</td></tr>"
			
	#テンプレートに値を反映する。 反映するのは各アプリの使用時間
	(Get-Content -Encoding UTF8 $template_report) | ForEach-Object {$_ -replace "tables_info",$tables_info } | Set-Content -Encoding UTF8 $report
}

# メッセージをログに記録する関数
# 引数:メッセージ
# 戻値:無し
function logging($message){
	$active_time = Get-Date -UFormat "%Y/%m/%d %H:%M:%S"
	$log_message = $active_time + " " + $message
	Write-Output $log_message | Out-File $exec_logfile -Append
}

#----------#
# main処理 #
#----------#

# プログラムの実行環境を確認する
check_exec_env

	# プログラムの実行状況を確認する 
check_program_execution

$code = @'
	[DllImport("user32.dll")]
	public static extern IntPtr GetForegroundWindow();
	[DllImport("user32.dll")]
	public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
'@

# Addt-Typeで読み込みと変数 ($myPid)の初期化
Add-Type $code -Name Utils -Namespace Win32
$myPid = [IntPtr]::Zero;

# 無限ループ 
while($true){
	#アクティブのウィンドウハンドルを取得する 
	$hwnd = [Win32.Utils]::GetForegroundWindow()

	#取得したウィンドウハンドルのプロセスIDを取得する
	$null = [Win32.Utils]::GetWindowThreadProcessId($hwnd, [ref] $myPid)

	# 取得したプロセスID の Name、MainWindowTitle を取得する
	$var = Get-Process | Where-Object ID -eq $myPid | Select-Object Name, MainWindowTitle

	# comオブジェクトを作成する
	$app = New-Object -com shell.application

	# アクティブウィンドウがexplorerだった場合、LocationURLをMainWindowTitle に入れる 
	if($var[0].Name -eq "explorer"){
		$var[0].MainWindowTitle = $app. Windows() | Where-Object {$_.fullname -match "explorer.exe"} | ForEach-Object {$_.LocationURL}
	}

	#アクティブウィンドウの情報を生成する 
	$active_time = Get-Date -UFormat "%Y/%m/%d %H:%M:%S"
	$active_window_info = $active_time + "," + $var[0].Name + "," + $var[0].MainWindowTitle

	# アクティブウィンドウの情報を記録する
	Write-Output $active_window_info | Out-File $history_file -Append

	# 指定時刻になったらプログラムを終了する 
	$now = Get-Date -UFormat "%H:%M"
	if( $now -eq $time_stop_script ){
		termination_process
	}

	#950ミリ秒 (0.95秒) 待つ 
	Start-Sleep -Milliseconds $interval
}

レポートのテンプレートファイル:template_report.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>yyyymmdd_作業履歴</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@3.7.1"></script>
    <script src="https://unpkg.com/chart.js-plugin-labels-dv@3.0.5/dist/chartjs-plugin-labels.min.js"></script>
    <script>
      window.onload = function () {
      let context_1 = document.querySelector("#pie_chart").getContext('2d')
      new Chart(context_1, {
      type: 'pie',
      data: {
        labels: [Name], 
		datasets: [{
			backgroundColor: [Colors],
			data: [Count]
        }]
      }, // data
      options: {
        responsive: false,
        plugins: {
          labels: {
            render: 'percentage',
            fontColor: 'gray',
            fontSize: 15
          }, // labels
        }, // plugins
      } // options
      });
      let context_2 = document.querySelector("#bar_chart").getContext('2d')
      new Chart(context_2, {
        type: 'bar',
        data: {
          labels: [Name],
          datasets: [{
            backgroundColor: [Colors],
            data: [Count]
          }] //datasets
        }, // data
        options: {
          plugins: {
            legend: {
              display: false,
            }, // legend
          }, //plugins
          responsive: false,
          scales: {
            y: {
              title: {
                display: false,
                text: '単位[秒数]'
              }, // title
              ticks: {
                callback: function(value){
                  return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',')+'秒'; // カンマと秒を付与
                },
              }, // ticks
            }, // y
          } // scales
        } // options
      });
      let process = [];
_PROCESS_
      let total = [];
      for(let i=0; i<=_TIMES_; i++){
        total[i] = 0;
        for( let j=0; j<_NUM_APPS_; j++){
        total[i] += process[j][i];
        }
      }

      let ratio =[];
      for(let i=0; i<_NUM_APPS_; i++){
        ratio[i] = [];
        for(let j=0; j<=_TIMES_; j++){
          ratio[i][j] = process[i][j] / total[j];
        }
      }

      let context_3 = document.querySelector("#stacked_chart").getContext('2d')
      new Chart(context_3, {
        type: 'bar',
        data: {
_LABELS_
_DATASETS_
        },
        options: {
          scales: {
            x: {
              stacked: true,
            }, // x
            y: {
              stacked: true,
              max: 1.0
            } // y
          }, // scales
          responsive: false
        } // options
      })
    }
  </script>
  </head>
  <body>
    <h2>yyyymmdd_作業履歴</h2>
    <hr>
    <h3>作業履歴の取得環境</h3>
    <table border="1">
    <tr><th>ユーザー名</th><th>ドメイン名</th><th>コンピューター名</th><th>OS名</th><th>OSバージョン</th></tr>
tables_info 
    </table>
    <hr>
    <h3>アプリケーションの使用時間</h3>
    <table border="1">
    <tr><th>アプリケーション</th><th>表示時間(分)</th></tr>
tables_apps
    </table>
    <hr>
    <canvas id="bar_chart" width="500" height="500"></canvas>
    <hr>
    <h3>アプリケーションの使用割合</h3>
    <canvas id="pie_chart" width="500" height="500"></canvas>
    <hr>
    <h3>時間あたりのアプリケーション使用率</h3>
    <canvas id="stacked_chart" width="500" height="500"></canvas>
    <hr>
    <h3>ウィンドウごとの表示時間</h3>
    <table border="1">
    <tr><th>ウィンドウ名</th><th>表示時間(秒)</th></tr>
tables_active
    </table>
  </body>
</html>

スクリプトの開始手順

Powershellターミナルから起動する手順

  1. Powershellスクリプトの実行ポリシーを変更しておきます。この手順は最初の1回だけです。  [スタート]->[Windows Powershell]->[Windows Powershell]を右クリック->[管理者として実行する]をクリックします。
  2. Powershellのターミナルが起動したら、下記コマンドレットを入力します。
    Set-ExecutionPolicy RemoteSigned
  3. Powershellのターミナルで下記を入力すると開始できます。
    /C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -File get_operation_log.ps1

参考:スクリプトのショートカットアイコンを作成する方法

  1.  任意の場所で[右クリック]->[新規作成]->[ショートカット]をクリックしてください。
  2. [項目の場所を入力してください]に下記を入力して[次へ]をクリックしてください。
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  3. [このショートカットの名前を入力してください]に[操作ログ取得]などの任意の名前を入力してください。
  4. [作成されたショートカットアイコン]->[右クリック]->[プロパティ]をクリックしてください。
  5. [リンク先]に下記を入力してください。
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -File get_operation_log.ps1
  6. [作業フォルダ]にスクリプトを配置しているフォルダパスを入力してください。Cドライブ直下の`get_operation_log`に配置している場合は、下記のように入力してください。
    "C:\get_operation_log"

    以上でショートカットアイコンを作成する方法は終了です。

スクリプトの停止手順

スクリプトは`$time_stop_script`で設定した時刻になると自動で停止します。
また、スクリプトを再度実行すると「作業履歴取得スクリプトの動作確認」ダイアログが表示されます。
「作業履歴取得スクリプトを終了しますか?」で「はい」を選択するとスクリプトは停止します。

ファイルの一括ダウンロード

スクリプトを実行するために必要なファイル、フォルダは下記からダウンロードできます。

コメント

タイトルとURLをコピーしました