こんにちは。
友人からいい感じのアイデアを貰い簡単なコーディングをしたので記録したいと思います。
要件定義
貰ったアイデア:
某アイドルの曲の中に、「シャットダウンする?」というセリフがあるので、PCをシャットダウン際に実際にそれを鳴らしたい
最初に話を聞いた時に軽く調べた時、タスクスケジューラで音声(今回は.wav)を再生するやり方に目を付けていたのですがタスクスケジューラで行う手法にした場合、シャットダウン確定後に「シャットダウンする?」と聞く旨の音声が流れるのは違和感があるなと思っていました。
そんな中、仕事で用いるPCにシャットダウン用のバッチファイルがあったことを思い出し、バッチファイルでの実現を検討しました。
イメージしていることをまとめると、
- バッチファイル又はショートカットを起動する
- ダイアログが起動しシャットダウン有無を確認、同時に音声を再生する
- ダイアログの回答でシャットダウンを実行するか処理を中断するか決定する
という感じになります。
実装
実際に書いたコードに沿って中身を確認していきましょう。
@echo off
rem 各種パス生成
set path=%~p0
set vbsFile=%path%msgbox.vbs
set wavPath=%path%shutdown.wav
rem 既にvbsが存在した場合に削除する
if exist "%vbsFile%" (
del /f "%vbsFile%"
)
rem vbs生成
echo Dim answer >> "%vbsFile%"
echo answer = msgbox("シャットダウンする?",vbYesNo + vbInformation,"藤島慈") >> "%vbsFile%"
echo WScript.Quit(answer) >> "%vbsFile%"
rem vbs実行
start /b %wavPath%
"%vbsFile%"
rem vbs実行結果確認
if %ERRORLEVEL% equ 6 (
start shutdown.exe /s /t 0
)
rem vbs削除
del /f "%vbsFile%"
まず、各種パスを生成します。
rem 各種パス生成
set path=%~p0
set vbsFile=%path%msgbox.vbs
set wavPath=%path%shutdown.wav
ここでは、1行目でバッチファイルの存在するフォルダのパスを取得し、2,3行目でダイアログを生成するvbsファイルと流す音声に対応したwavファイル名を定義しています。
パスは直接指定してもいいのですが、今回は友人向けに作成しているので他の環境でも動作することを目指してこのようなコードにしています。ファイルを移動させても正常に動作しますしね。
if exist "%vbsFile%" (
del /f "%vbsFile%"
)
次のコードでは、同一階層にmsgbox.vbsが既に存在していた場合に削除するようにしています。
スクリプトの最後に削除処理はありますが、念のため実装をしています。
rem vbs生成
echo Dim answer >> "%vbsFile%"
echo answer = msgbox("シャットダウンする?",vbYesNo + vbInformation,"藤島慈") >> "%vbsFile%"
echo WScript.Quit(answer) >> "%vbsFile%"
rem vbs実行
start /b %wavPath%
"%vbsFile%"
さて、いよいよシャットダウンの機構の本体部分になります。
シャットダウンの確認をするダイアログを生成したのち、音声ファイルと一緒に実行しています。
msgboxの後ろの部分にダイアログの内容を記載し、ユーザーからの入力値(今回はY/N)を変数answerで受け取っています。
vbsでコマンドを実行しているため、このままでは戻り値としてanswerを使えないのでWScript.Quit(answer)とすることで%ERRORLEVEL%に実行結果を返しています。
気持ち程度ですが、実行時に音声→vbsとすることでダイアログが上に表示されるので音声を再生するウィンドウが邪魔にならなくていい感じでした。
rem vbs実行結果確認
if %ERRORLEVEL% equ 6 (
start shutdown.exe /s /t 0
)
rem vbs削除
del /f "%vbsFile%"
最後に、vbs実行後の処理です。
前述しましたが、vbsの実行結果を%ERRORLEVEL%で受け取っています。Y/Nの場合、Yesが6、Noが7を返します。
(参考:https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/msgbox-constants)
今回はYesだった場合にシャットダウン処理を実行したいため%ERRORLEVEL%が6であるかの判定をしています。
その後、vbsを削除して終了となります。
感想等
コマンドの関係上1つのディレクトリに格納する必要があったので、折角だと思ってアイコンも作成したらアプリケーションっぽくなって達成感がありました。
↓こんな感じ
タイムスタンプからわかる通り、昨年の8月に軽く作成してこの度改めて触ったのですが、shutdown.exeのpathが通っておらず、追加する必要がありました。環境によると思いますが使用者が設定する必要があるので課題点かなと感じました。
今回はいいアイデアを頂けたのでバッチファイルを触りましたが、OSの様々な操作に応用できそうなので今後もいろいろ試してみようと思いました!
最後までお読みいただきありがとうございました。