0

もし私に手を貸してくれたら、それは素晴らしいことですか?

いくつかのプログラムを 1 つずつインストールするための HTA ファイルがあります。

インストールが完了するのを待ってから次のプログラムをインストールする方法についていくつかの場所で読んでいますが、私が望むものには意味がありません。 HTAですよね?

私は、Firefox、utorrent、Symantec Antivirus、Adobe Reader、Office 2003 (すでに KEY が同梱されています) などを持っています。

サイレントにインストールするスイッチを見つけたいのですが、このコードが機能することを示してくれるかどうかは重要ではありません...

私は理にかなっていると思いますか?

あなたが私を助けることができれば、それは素晴らしいことでしょうか?

乾杯パブレ。

4

1 に答える 1

0

この質問に対する私の回答 ( https://stackoverflow.com/a/3742182/128427 )で役立つ情報が見つかるかもしれません: HTA を再起動するにはどうすればよいですか?

VBScript ヘルパーを使用して、プロセス (HTA 自体) が終了するのを待ってから、HTA を再起動します。代わりに vbscript を変更して、特定のプロセス (インストーラーの 1 つ) が終了するのを待機し、制御を HTA に戻して、次のインストーラーを開始し、待機スクリプトを再度呼び出すことができます。

HTA が WScript.Sleep ルーチンを呼び出すことはできないと思いますが、HTA には、X 秒後にルーチンを呼び出す、またはキャンセルされるまで X 秒ごとに繰り返しルーチンを呼び出す setTimeout メソッドと setInterval メソッドがあります。これらを使用して、プロセスがまだ実行されているかどうかを定期的に確認できます (他の回答で示したように、WMI Win32_Process を使用)。

このようなアイテムのリストを処理するには、ループを使用してリストを調べ、各アイテムの後に一時停止する代わりに、システムを進めるために頻繁に自分自身を呼び出す中央のステートマシン ルーチンを使用します。

'!! extremely "pseudo" pseudo-code follows

sub StartSystem()
    state = "next program"
    list = list of programs to install
    AdvanceSystem() 
end sub

sub AdvanceSystem()

    if state = "next program"

        if more items in list
            start next installer
            remove from list (or increment an index)

            set state to "check program"
        else
            set state to "done"

    if state = "check program"

        use WMI to see if process is still running
        if no
            state = "next program"

    if state <> "done"
        setInterval(AdvanceSystem, 5000) ' call again in 5 seconds

end sub


' then somewhere in your HTA interface have a button to start things off
buttonClick = StartSystem()

このような配置を使用すると、別の VBScript を実行してプロセスとスリープをチェックする必要さえない場合があります。また、この種の増分プロセスでは、出力をどこかの DIV に送信して、ユーザーが進行状況を確認できるようにすることができますが、ループ内で物事を処理する場合、プロセス全体が完了するまで出力は表示されません。AdvanceSystem を通過するたびに、コントロールは HTA レベルに戻り、システムはそれ自体を更新できます。

より具体的な例が必要な場合はお知らせください。何かを書き込もうとします。

于 2013-02-02T15:12:23.913 に答える