Autoit の関数 ShellExecute を使用してプログラムを実行するサンプルコードを紹介します。
ShellExecute は、ShellExecute API を使用して外部プログラムを実行します。
筆者はよく ShellExecute を使ってプログラムや WEB サイトを開いています。
Windows の「ファイル名を指定して実行」のような動作をします。
ShellExecute
書式は次のようになります。
ShellExecute ( "filename" [, "parameters" [, "workingdir" [, "verb" [, showflag]]]] )
パラメーター
- filename = 実行するファイルの名前 (EXE、.txt、.lnk など)。
ファイルのパスに @TempDir などのマクロが使えます。 - parameters = [オプション] プログラムの任意のパラメータ。
空白 (“”) は何も使用しません。
parameters は、通常空白ですが、ここには引数を指定することが出来ます。 - workingdir = [オプション] 作業ディレクトリ。
空白 (“”) は、現在の作業ディレクトリを使用します。 - verb = [オプション] 使用する「動詞」。
一般的な動詞には次のものがあります。
$SHEX_OPEN (“open”) = 指定されたファイルを開きます。
ファイルは、実行可能ファイル、ドキュメント ファイル、またはフォルダーのいずれかです。
$SHEX_EDIT (“edit”) = エディターを起動し、編集用にドキュメントを開きます。
「filename」がドキュメントファイルでない場合、関数は失敗します。
$SHEX_PRINT (“print”) = 指定されたドキュメントファイルを印刷します。
「filename」がドキュメントファイルでない場合、関数は失敗します。
$SHEX_PROPERTIES (“properties”) = ファイル、フォルダのプロパティを表示します。
要求されたプログラムを実行後、スクリプト処理が継続して実行されます。
実行したプログラムが終了するまでスクリプトの処理を一時停止する場合は代わりにShellExecuteWait関数を使用してください。
動詞(verb)が指定されていない場合、デフォルトの動詞(verb)が使用されます。デフォルトの動詞(verb)はレジストリ内の動詞(verb)設定です。レジストリ内にデフォルトの動詞(verb)が設定されていない場合動詞(verb)として”open”が使用されます。動詞(verb)の”open”が存在しない場合、レジストリ内のリストの最初の動詞(verb)が使用されます。
環境によっては、動詞(verb) を指定しないと開けないファイルがあります。
定数は「AutoItConstants.au3」で定義されています。(AutoItConstants.au3 をインクルードすることで定数が使用できます)
- showflag [オプション] 実行されたプログラムの「表示」フラグ
@SW_HIDE = ウィンドウ非表示
@SW_MINIMIZE = ウィンドウ最小化
@SW_MAXIMIZE = ウィンドウ最大化
parameters(引数)を指定したサンプル
次のコードは、どちらもレジストリエディタを開きます。
ShellExecute("regedit"); レジストリエディタを1つしか開けない
ShellExecute("regedit", "-m"); レジストリエディタを複数開ける
WEB サイトの URL を指定すると、デフォルトのブラウザーでページを開きます。
ShellExecute("https://windows-waza.com/")
間違ったコード
例えば、次のコードは「プログラムの追加と削除」を開くコマンドですが、
rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0
これをそのまま ShellExecute 関数で開くとエラーが出ます。
ShellExecute("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0")

正しいコード
この場合、「rundll32.exe」が実行するファイルの名前で、「shell32.dll,Control_RunDLL appwiz.cpl,,0」が引数になるので、次のように書きます。
ShellExecute("rundll32.exe", "shell32.dll,Control_RunDLL appwiz.cpl,,0")
workingdir 作業ディレクトリ
作業ディレクトリは通常は空白で使いますが、プログラムによって指定することもあります。
例えばコマンドプロンプトを実行する場合、
ShellExecute(“cmd”) で開くと画像のように現在のユーザーのデスクトップが表示されています。
この表示はユーザーによって違います。
作業ディレクトリを指定して ShellExecute(“cmd”, “”, “C:\”) のように書くと、指定したディレクトリが表示された状態で開きます。
返し値
返し値は、成功した場合は起動したプロセスの PID を返し、有効なプロセスがなかった場合 -1 を返します。
$ReturnValue = ShellExecute("cmd", "", "C:\")
MsgBox(0, @error, $ReturnValue)
成功した場合、@error は「0」に設定され、プロセスの PID が返されます。

間違ったコードを書くと、@error は、「0」以外に設定され、返し値は「0」になります。
$ReturnValue = ShellExecute("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0")
MsgBox(0, @error, $ReturnValue)

開くプログラムを指定してファイルを開く
次の 3つのサンプルは、「systeminfo.html」というファイルを開くコードです。
1. ShellExecute(@DesktopDir & "\systeminfo.html")
2. ShellExecute("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", @DesktopDir & "\systeminfo.html",)
3. ShellExecute("chrome.exe", @DesktopDir & "\systeminfo.html", "C:\Program Files (x86)\Google\Chrome\Application")
1番目のコードは、OS でデフォルトに指定しているプログラム(ブラウザーなど)で開きます。
2番目のコードは、プログラム Google Chrome を指定してファイルを開きます。
3番目のコードは、2番目と同じく Google Chrome を指定してファイルを開きますが、作業ディレクトリを指定しています。
作業ディレクトリをプログラムの置いてあるディレクトリに指定すると、プログラムはフルパスを指定しなくてもファイル名のみ指定するだけで開くことが出来ます。
プログラムを指定して実行する場合、開きたいファイルを引数に指定します。
ウィンドウの状態を指定して開く
次の3つのコードは、レジストリエディタを開く際に、ウィンドウの状態を指定しています。
$pid = ShellExecute("regedit", "-m", "", "", @SW_HIDE)
MsgBox(0, "pid", $pid)
ShellExecute("regedit", "-m", "", "edit", @SW_MINIMIZE)
MsgBox(0, "", "最小化")
ShellExecute("regedit", "-m", "", "open", @SW_MAXIMIZE)
MsgBox(0, "", "最大化")
1つ目は、ウィンドウの非表示を指定しているので、ウィンドウが表示されません。
タスクバーにも表示されませんが、タスクマネージャーで確認するとレジストリエディタが実行されているのが確認できます。

2つ目は、ウィンドウの最小化を指定しているので、ウィンドウは最小化された状態で開き、タスクバーにも表示されます。
3つ目は、ウィンドウを最大化した状態で開きます。
何も指定しない場合は、通常通り開きますので、作成するプログラムによって使い分けてください。
プログラムを管理者として実行する
プログラムを管理者として実行したい場合、動詞(verb) を指定します。(ヘルプファイルには記述がありません)
プログラムを管理者として実行したい場合、動詞(verb) に「runas」を指定します。
1. ShellExecute("cmd")
2. ShellExecute("cmd", "", "", "runas")
1つ目は、コマンドプロンプトを通常通り開きます。
2つ目は、コマンドプロンプトを管理者として開きます。
Windows でファイルを右クリック>「管理者として実行」をクリックした時と同じ動作をします。
実際に実行して確認してみてください。
コメント