【AutoIt】「名前を付けて保存」と「上書き確認」を自動化する

ファイルのダウンロードや、ドキュメントの新規保存など、PC 作業の様々な場面で「名前を付けて保存」ダイアログボックスは登場します。

一連の作業を自動化する上で、このダイアログをいかにして操作するかは、避けては通れない重要なステップです。

今回は、AutoIt を使って「名前を付けて保存」ダイアログを確実に検出し、ファイル名を入力して保存ボタンをクリックします。

さらに、もしファイルが既に存在していた場合に表示される「上書き確認」ダイアログも検知し、自動で「はい」をクリックする、より高度で信頼性の高いテクニックを解説します。

目次

完成したスクリプトの全コード

#include <MsgBoxConstants.au3>

; ### 設定項目 ###
Local $sSavePath = @DesktopDir & "\MyTestFile.txt" ; 保存したいファイルのフルパス

; ### メイン処理 ###

Run("notepad.exe")

Local $hWnd = WinWaitActive("[CLASS:Notepad]")

Send("これは自動入力されたテキストです。")
Sleep(500)

Send("^s")

Local $hSaveDialog = WinWaitActive("名前を付けて保存")

If $hSaveDialog Then
    ControlSetText($hSaveDialog, "", "Edit1", $sSavePath)
    Sleep(500)
    ControlClick($hSaveDialog, "", "Button2")
Else
    MsgBox($MB_ICONERROR, "エラー", "「名前を付けて保存」ダイアログが見つかりませんでした。")
    _CleanupAndExit()
EndIf

; 上書き確認ダイアログ(タイトルは環境に合わせて調整)が出現するかチェック
If WinWait("名前を付けて保存の確認", "", 2) Then
    WinWaitActive("名前を付けて保存の確認")
    ControlClick("名前を付けて保存の確認", "", "Button1") ; 「はい」ボタンをクリック
EndIf

WinWaitClose("名前を付けて保存の確認", "", 5)
WinWaitClose($hSaveDialog, "", 5)

WinClose($hWnd)

If FileGetSize($sSavePath) > 0 Then ; ファイルサイズが0より大きいかで成功を判断
    MsgBox($MB_OK, "成功", "ファイルの保存が正常に完了しました。")
Else
    MsgBox($MB_ICONERROR, "失敗", "ファイルの保存に失敗しました。")
EndIf


; ### 終了処理をまとめた関数 ###
Func _CleanupAndExit()
    WinClose("[CLASS:Notepad]")
    Exit
EndFunc   ;==>_CleanupAndExit

コードの詳しい解説

操作対象コントロールの特定

このスクリプトの最も重要な事前準備は、操作したいダイアログボックスと、その中にある部品(コントロール)の名前を正確に知ることです。

そのために、AutoIt に付属している「AutoIt Window Info Tool」(Au3Info.exe)を使います。

このツールを使い、操作したいウィンドウ(「名前を付けて保存」ダイアログや「上書き確認」ダイアログ)と、その中のコントロール(ファイル名入力欄や「はい」「保存」ボタン)の正確な情報をあらかじめ調べておきます。

「AutoIt Window Info Tool」ウィンドウ情報ツールの場所、使い方、サンプルコード

「名前を付けて保存」の自動操作

下記のコードはテストのために自動で文字を入力してから「保存(Ctrl + S)」を実行しています。不要な場合は削除してください。

Send("これは自動入力されたテキストです。")
Sleep(500)

Send("^s")

WinWaitActiveControl系の関数を組み合わせるのが、ダイアログ操作の基本パターンです。

  • WinWaitActive: 指定したタイトルのウィンドウが出現し、アクティブになるまでスクリプトの実行を一時停止させます。
  • ControlSetText: 特定のコントロール(Edit1)に対して、保存したいファイルパスを一瞬で入力します。
  • ControlClick: 特定のコントロール(Button2)をプログラムがクリックし、保存を実行します。

「上書き確認」への対応

ここが、スクリプトの信頼性を高めるための重要な部分です。

If WinWait("名前を付けて保存の確認", "", 2) Then
    WinWaitActive("名前を付けて保存の確認")
    ControlClick("名前を付けて保存の確認", "", "Button1") ; 「はい」ボタンをクリック
EndIf
  1. WinWait("...", "", 2): WinWait関数を使い、「上書き確認」ダイアログが出現するかどうかを最大2秒間だけ監視します。
    • ファイルが新規保存の場合: 上書き確認は出ないので、2秒待ってもウィンドウは現れず、このIf文は無視されてスクリプトはスムーズに続行します。
    • ファイルが上書きの場合: すぐに「上書き確認」ダイアログが出現するので、条件が満たされてIf文の中の処理が実行されます。
  2. ControlClick(...): 「確認」ダイアログが出現した場合、そのウィンドウの中にある「はい」ボタン(通常はButton1)をクリックして、上書きを許可します。

成功判定の改善

FileExists では、中身が空のファイルでも「成功」と判定してしまう可能性がありました。

これを、FileGetSize($sSavePath) > 0 という条件に変更しました。これにより、ファイルが存在し、かつ中身が空ではない(正しくテキストが書き込まれている)場合にのみ、「成功」と判定するようになり、信頼性が向上しました。

確実な待機処理

ControlClickで保存ボタンをクリックした後、実際にファイルがディスクに書き込まれてダイアログが閉じるまでには、コンマ数秒の時間がかかります。

スクリプトが次の動作(例:メモ帳を閉じる)にすぐ移ってしまうと、保存が完了する前にプロセスが終了し、ファイルが破損する原因となります。

この問題を確実に避けるため、以下の 2段階の待機処理を行っています。

1段階目の待機

WinWaitClose("名前を付けて保存の確認", "", 5)

これは、上書き確認ダイアログ(「はい」をクリックしたウィンドウ)が閉じるのを待ちます。最大で 5秒間待ち、もし 5秒経っても閉じなければ、タイムアウトして次の処理へ進みます。

WinWaitClose関数は、もし指定したウィンドウが存在しない場合は「1」(ウィンドウが閉じたときと同じ)を返すため、すぐ(約250ミリ秒後)に次の処理へ進みます。

2段階目の待機

WinWaitClose($hSaveDialog, "", 5)

次に、メインの「名前を付けて保存」ダイアログが閉じるのを待ちます。このダイアログは、ファイルの書き込み処理が完全に完了した後に閉じるため、この関数の完了をもって「保存が成功した」と確実に判断できます。

この 2段階のWinWaitCloseを使うことで、「とりあえず 1秒待つ」といった曖昧なSleepと違い、PC の処理速度やファイルの大きさに関わらず、必要な時間だけ正確に待機することができ、非常に信頼性の高いスクリプトになります。

まとめ

この「予期せぬ、あるいは状況によって出現するダイアログを、WinWaitのタイムアウト機能を使って待機・対応する」というパターンは、より複雑で堅牢なアプリケーション自動化を行う上で、非常に重要なテクニックです。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次