開いたファイルをまた開きたい

4日目@なろうアドベンター
https://adventar.org/calendars/5540

Windows上で現在開いているファイルを記録し、ファイルを閉じた後に再度一括で開き直す処理を行うバッチファイルを作成しました。

経緯

Windowsでの作業時、いろんなファイルを並行で開いて作業することが多いのですが、Windows Update等でOSを再起動するときにファイルを開きなおすのが面倒になるので「タスクマネージャ的な情報にアクセスして開いているファイルの情報を保存し、後日同じファイル群を開き直すスクリプトが欲しいな」と思い、バッチファイルで作ってみました。

正直なところ、私以外にこの処理を必要とする人が地球上にいるのかどうか不明ですが、そういう処理ほど世間に該当する機能を持ったアプリケーションがなく、自分でなんとかしないといけないことになるため、60億分のごくわずかの、どこかの誰かのために記録を残しておきます。

実装のイメージ

タスクマネージャの情報について、CLIコマンドではtasklistコマンドでアクセス可能です。
しかし、こちらのコマンドだと起動しているプロセスの情報が参照されるのみで、プロセスが参照しているファイルそのものの情報は取得できません。

そこで、今回はWMIにアクセスするコマンド体系であるwmicコマンドを使用してプロセス情報を取得する方法を採ります。
wmic processコマンドでは、プロセス実行時のコマンドが引数込みで参照できるため、引数からファイルパスを判別する目論見です。

制限事項

wmic processで開いているファイルが取得できるのは以下の条件に合致する場合のみです。
・アプリケーション起動時に引数でファイル名を指定した場合に限る
・ファイルごとに独立したプロセスを起動するアプリケーションである

例示すると、まず引数なしでアプリケーションを起動し、作業後にファイル名を付けて保存したファイル等は参照できません。
また、Word、Excel等の同一プロセス上に複数ファイルが展開されるアプリケーションにも対応していません。

Word、Excel等はアプリケーション個別のプロパティから開いているファイルを特定する方法はおそらくありますが、アプリケーション個別の実装となるため今回は対象外とします。

コード

コードは「現在開いているファイルをテキストに出力するバッチファイル」と「出力されたテキストの内容を読み取って同じファイルを開くバッチファイル」の2つで構成されています。

OpenedFileSave.bat

@echo off
setlocal

pushd "%~dp0"

set YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%
set TEMP_TIME=%time: =0%
set HHMMSS=%TEMP_TIME:~0,2%%TEMP_TIME:~3,2%%TEMP_TIME:~6,2%
set Output_FILE="OpenedFile_%YYYYMMDD%%HHMMSS%.txt"

wmic process where "name = 'notepad.exe'" get commandline > .\tempOpenedFileData.txt

If not exist OpenedFileData mkdir OpenedFileData

chcp 65001
type .\tempOpenedFileData.txt > .\OpenedFileData\%Output_FILE%

del .\tempOpenedFileData.txt

set /p tempText=<.\OpenedFileData\%Output_FILE%

if "%tempText%"=="" (
	del .\OpenedFileData\%Output_FILE%
)

popd

exit

OpenedFileLoad.bat

@echo off
setlocal 

pushd "%~dp0"
chcp 65001

dir .\OpenedFileData\*.* /b /od > .\tempOpenedFileData.txt

for /f %%a in (tempOpenedFileData.txt) do set TargetFile=%%a

for /f "skip=1 delims=<>" %%i in (.\OpenedFileData\%TargetFile%) do (
	start %%i
)

popd

del .\tempOpenedFileData.txt

exit

現在のコードではnotepad.exeで開いているファイルが対象になっていますが、この部分を書き換えれば、1ファイル1プロセスで動作する限りは別のアプリケーションにも対応できると思います。

■利用方法
OpenedFileSave.batを実行すると、batファイルから現在実行されているプロセスのうち、指定された実行ファイルに基づくものがピックアップされ「OpenedFileData」フォルダ配下にテキストファイルとして出力されます。

その際、プロセス実行時に引数に指定されたファイル名を含んだ一連のコマンドとして記録されるため、同様のコマンドを流せば開いていたファイルを再度開くことができるという設計になります。

OpenedFileLoad.batが実行していることは「OpenedFileData」フォルダ内の最新のテキストファイルを読み込んで、1行目を除いた内容をコマンドとして実行する処理となります。

カスタマイズして使用する場合は、対象とするexeの個所を修正することと、プログラムによっては内部的な処理のためにのみ立ち上げているプロセスが含まれていたりするので、そうしたものをLoad側で除外する処理を追記してください。


この記事が気に入ったらサポートをしてみませんか?