見出し画像

《Windows11》メモ帳のタブを設定を変えずにクリアする

Windows11でメモ帳でタブを開いたまま終了すると、次に起動した時同じ状態で開かれてしまいます。
設定でクリアした状態で起動するようにすることも出来るんですが、設定は変更せずにクリアしておきたいという状況に遭ったので、その時の事を書き残しておきます。

メモ帳を開いた時の右上の歯車マーク
→メモ帳の起動時→「新しいウィンドウを開く」
でクリアした状態で起動できます。


開いているタブの状態はどこで記録しているのか?

C:\Users\<アカウント名>\AppData\Local\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState

つまりこの中身を消すバッチファイルを作ります。

必要な構文・コマンド

・wmic useraccount get name

アカウント名を調べるコマンドは幾つかありますが、名前だけ知れたらいいのでこれが一番使い勝手が良いと思います。
あ、言い忘れていましたが全部のアカウントでの履歴クリアを想定しています。

・for /f "usebackq skip=1" %%a in (`wmic useraccount get name`) do ( ~~~ )

for文で先ほどのアカウント名リストを回すために、オプションに usebackq を指定するとコマンドの返り値を分割して渡してくれるようになります。
1個目はプロパティ名("Name")の文字が入っているので、 skip オプションで飛ばしています。

==================================================

これだけでもう作れそうな気はしますが、実際にやってみると・・・

@echo off
rem ================================
rem メモ帳の履歴をクリアする
rem ================================
setlocal EnableDelayedExpansion
for /f "usebackq skip=1" %%a in (`wmic useraccount get name`) do (
echo.
echo %%a アカウントのメモ帳のログを削除
del C:\Users\%%a\AppData\Local\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState\*.*
)
echo.
)
pause
endlocal

なぜか端末によって成功したり失敗したりします。
皆さんの環境ではどうなりましたか?

原因

失敗する環境では、コンソールの出力にあるように、パスがアカウント名の後ろで途切れてしまっています。
色々試してみると、どうやらアカウント名の文字列の末尾に特殊な文字(終端文字とかですかね?)が入っているようで、これをどうにかしないといけません。

それを踏まえた上で

@echo off
rem ================================
rem メモ帳の履歴をクリアする
rem ================================
setlocal EnableDelayedExpansion
for /f "usebackq skip=1" %%a in (`wmic useraccount get name`) do (
set name=%%a
set cut_str=!name!
call :STRLEN !name!
call :STRCUT !str_len!
set name=!retCUT!
echo.
echo !name! アカウントのメモ帳のログを削除
del C:\Users\!name!\AppData\Local\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState\*.*
)
echo.
)
pause
endlocal

rem ================================
rem 引数1の文字数をカウントする関数
rem 引数1にカウントしたい文字列
rem str_len にカウント数
rem ================================
:STRLEN
set str=%1
set str_len=0
:LOOP
if not "%str%"=="" (
    set str=%str:~1%
    set /a str_len=%str_len%+1
    goto :LOOP
)
exit /b 0

rem ==============================
rem 文字数を引数1分カットする関数
rem cut_str にカットしたい文字列
rem retCUT にカットした後の文字列
rem ==============================
:STRCUT
set retCUT=!cut_str:~0,%1!
exit /b 0

文字をカウントし、その文字数で切り上げるという一見無駄な処理を挟むことで失敗していた環境でも無事に履歴の削除ができるようになりました。
バッチなんも分からん。


いいなと思ったら応援しよう!