【Powershell】Windows10の標準機能だけで一定間隔でスクショを取りたい

業務ごとに工数入力をしないといけないのに、過去に何をしていたか思い出せない。
それなら、定期的にスクショを取っておけばいいじゃないという発想で作成。

# 目次
[1. 構成](#1-構成)
[2. powershellスクリプト](#2-powershellスクリプト)
[3. VBS](#3-VBS)
[4. タスクスケジューラ設定](#4-タスクスケジューラ設定)

# 1. 構成
使用する機能は以下の3つを使用します。

- Powershell
- VBS
- タスクスケジューラ

フォルダ構成は以下を想定しています。

C:\worklog\
　┣ printscreen.xml
　┣ printscreen.vbs
　┣ printscreen.ps1
　┗ yyyymmdd-hhmm.png ← 5分に1ファイル作成される

# 2. powershellスクリプト
```printscreen.ps1
$path = "C:\worklog\"
$file = (Get-Date).ToString("yyyyMMdd-HHmmss") + ".png"

Add-Type -A System.Windows.Forms

[Windows.Forms.Screen]::PrimaryScreen.Bounds |
    % {[Drawing.Bitmap]::New($_.Width, $_.Height)} |
    sv b

[Drawing.Graphics]::FromImage($b).CopyFromScreen(0, 0, $b.Size)

md -f $path

% { $path + $file -f $_ }  |
? { (Test-Path $_) -eq $false } |
select -F 1 |
% { $b.Save($_) }
```

# 3. VBS
VBSを使用する理由としては、Powershell実行時のウィンドウポップアップ表示を防ぐため。

Powershellウィンドウが突如現れると作業がいちいち止まるので、VBS経由で実行するのが吉。

VBSからps1ファイルを実行する方法は、下記サイトを参考にさせていただきました。
[PowerShell のウィンドウを一切表示させずに実行する](https://neos21.net/blog/2021/08/10-01.html)

```printscreen.vbs
Option Explicit
Dim psFilePath : psFilePath = Replace(WScript.ScriptFullName, ".vbs", ".ps1")
WScript.CreateObject("WScript.Shell").Run "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -File " & Chr(34) & psFilePath & Chr(34), 0
```

# 4. タスクスケジューラ設定
クライアントPCで使用するなら電源ケーブル未使用時にも実行させるよう設定値を編集する必要があったり、スクショ漏れを防ぐためにタスク未完了時は並列処理させたりと、なんだかんだ考慮すべき点があります。

なので、①下記をコピー、②xmlファイルとして保存、③タスクスケジューラでインポート、することを推奨します。

※ユーザー名等、環境固有情報は適宜修正いただく必要があります。

```printscreen.xml
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2021-11-23T00:02:12.9020652</Date>
    <Author>TNTHINKPAD\user</Author>
    <URI>\printscreen</URI>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <Repetition>
        <Interval>PT5M</Interval>
        <Duration>P1D</Duration>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
      <StartBoundary>2022-01-18T09:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-1659786343-3538112764-2108308975-1001</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>false</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>false</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\worklog\printscreen.vbs</Command>
    </Exec>
  </Actions>
</Task>
```