1. ホーム
  2. スクリプト・コラム
  3. vbs

VBSのRunとExecの違い

2022-02-08 06:39:14
Set ws = CreateObject("WScript.Shell")
'Create an object reference here to be used in the following example code.
'Demon's note: Why is this variable name so obscene (WS)

構文です。(常識(鬼注:常識は好きな言葉です):手続きとして使う場合、括弧を付けないとコンパイラエラーになります(引数がユニークな場合や無い場合に括弧を付けてもエラーにはなりませんが、付けない方が良いと思います))

ws.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
[Set objExec =] ws.Exec(strCommand)

WScript.Shellオブジェクトのこの2つのメソッド。

どちらもプログラムの実行に使用することができ、引数を取ることができます。
どちらも、プログラムパスで環境変数を使用することができます。
どちらもプログラムの作業ディレクトリを指定したり、優先順位を設定することはできません(startコマンドは可能です)。
作業ディレクトリを指定するには、スクリプトホスト(wscript.exe/cscript.exe)の現在の作業ディレクトリを変更するだけです: ws.CurrentDirectory = "Working Directory" (常識:作業ディレクトリの意義は何ですか。1、いくつかのプログラムは、対応するディレクトリ2、相対パスの問題でDLLおよびその他の関連ファイルのサポートが必要)

RunとExecの違いについて。

1. run は、ファイルを直接実行することができます(プロトコルファイルを含む)。これは、ファイルを開くために関連付けられたプログラムを起動します(関連付けられていない場合はエラーとなります)。start にもこの機能があります(より高度には、関連付けられていない場合は "open way" のダイアログを開きます)。

ws.Run "c:\boot.ini"
ws.Exec "notepad c:\boot.ini"

2. runは、path環境変数ディレクトリで直接プログラムを実行するだけでなく、レジストリのApp Pathsで設定されたプログラム"aliases"も実行されます。

ws.Run "iexplore"
'iexplore is registered as an alias in App Paths.
ws.Exec "calc"

3. run は、プログラムが終了するのを待ってから次のコマンドを実行することができます。

<ブロッククオート

ws.Run "notepad", ,true

4、実行は、それがスペースを含んでいても、プログラムのパスを実行すると、(引用符などのパラメータは、その引用符を省略することはできません)引用符を追加することはできません。(常識:vbsの引用符の文字&quot;自体は、2つの引用符で表現すること、つまり、&quot;&quot;として書かれています。また、Chr関数で引用符を取得することもできます:chr(34))

<ブロッククオート

ws.Exec "C:♪Program FilesInternet Explorer ♪IEXPLORE.EXE"
ws.Exec ""C:\Program FilesInternet Explorer.EXE"""
ws.Run ""C:\Program FilesInternet Explorer.EXE""""

5. 最大の違いは、Runは開始制御(ウィンドウの形を設定すること)に重点を置いていることです。(Startは名前からして起動のためですが、単にウィンドウの最大化、最小化の設定もします)。Execはその後の制御と、コマンドラインプログラムの制御に重点を置いています。

runは、プログラム実行時の実行モード(フォアグラウンドとバックグラウンド:ウィンドウを隠すかどうか)、ウィンドウサイズ、起動状態("focus"を得るかどうか)を設定します。
Execは、プログラム起動後の制御も可能で、実行状態の取得、PIDの取得、プロセスの強制中断ができます。コマンドライン・プログラムを実行している場合、StdIn/StdOut/StdErrストリームへのアクセスも提供できます:実行コマンドの書き込み、コマンド出力の取得、などなど。コマンドライン・プログラムを実行した後は、StdInを介してのみコマンドを書き込むことができ、コンソール・ウィンドウはユーザー入力を受け付けなくなります。

<ブロッククオート

ws.Run "notepad", 0
'ウィンドウを隠す

ws.Run "notepad", 4
'アクティベーションを行わず、元のアクティブウィンドウを乱すことなく実行します。

なお、マニュアルでは、Runはすべてのプログラムが指定したウィンドウとして実行されることを拘束することはできず、ieploreやcalcなど、それを聞き入れないプログラムもあることを明記しています。ieploreを実行すると、フォーカスを取り、アクティブウィンドウになります。ieploreを実行すると、フォーカスを取り、アクティブウィンドウになります。 runはcalcを最小化した状態で実行することができません。

Set oExec = ws.Exec("mspaint")
WScript.Echo oExec.ProcessId
Terminate
WScript.Echo oExec.Status '0 is running, 1 is finished
Set oExec = ws.Exec("ipconfig")
WScript.Echo oExec.StdOut.ReadAll

エクゼクティブの応用例

1、Runasは自動的にパスワードを入力します:セキュリティ上の理由から設計されるかもしれませんが、Runasは、パイプラインの配信または取得するファイルからリダイレクトを受信しない、パスワードを手動で入力する必要があります入力し、この問題は、多くの人々を悩ませているが、解決することは困難、Sendkeysと必ずしも安全ではありません(悪魔のノートです。ターゲットウィンドウは、常にフォーカスを取得する保証はありませんので、私は、Sendkeysは、信頼性が高いではありませんが、私はしばしば、それを使用して多くの人々を参照してください本当に未知の質量、悲しい)することはできません前に何度も言っている悪魔のノート:私は前に何度も言っているSendkeysが信頼されていないこと。Execメソッドを使えば、簡単に自動入力ができます。

Set ws = CreateObject("WScript.Shell")
Set oExec = ws.Exec("cmd.exe")
WriteLine "runas /user:username setup.bat". oexec.StdIn.WriteLine "runas /user:username setup.bat"
WriteLine "password". oexec.StdIn.WriteLine "runas /user:username setup.bat" oexec.StdIn.WriteLine "password"

2、ExecとRunの組み合わせで使用します。実行メソッドは、コマンドラインプログラムの出力を得るために、ウィンドウを非表示にすることはできません、そこに黒渦巻きウィンドウフラッシュ、見苦しいだけでなく、他のユーザーが誤ってそれはトロイの木馬か何か、非常に不完全だと思うようになる。どのようにこの問題を解決するには?ちょうど実行とExecを動作させる

Set ws = CreateObject("WScript.Shell")
host = WScript.FullName
'Demon note: here do not need to be so complicated, LCase(Right(host, 11)) is not on the line
If LCase( right(host, len(host)-InStrRev(host,"\")) ) = "wscript.exe" Then
  ws.run "cscript """ & WScript.ScriptFullName & chr(34), 0
  WScript.Quit
End If
Set oexec = ws.Exec( "ipconfig")
Msgbox oExec.StdOut.ReadAll, , "ipconfig"
'Do not use WScript.Echo at this point, as it is currently running on the console
'The result of WScript.Echo will be output on the console, without popup dialogs.

vbsRunメソッド

オブジェクト.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

[パラメータ
オブジェクト
WshShellオブジェクトです。
strCommand
実行するコマンドラインを示す文字列値。実行ファイルに渡されるすべての引数が含まれます。
intWindowStyle
オプション。プログラムウィンドウの外観を示す整数値。
すべての番組がこの情報を使用するわけではないことに注意してください。
bWaitOnReturn
オプション。スクリプトの次のステートメントで続行する前に、スクリプトがプログラムの実行を終了するのを待つかどうかを示すブール値です。
true を設定すると、プログラムの実行が終了した後にスクリプトが実行され、Run メソッドはプログラムから返されたエラーコードを返します。
false(デフォルト)に設定すると、プログラム起動直後にRunメソッドは自動的に0(エラーコードでない)を返します。
注]
Runメソッドは整数を返します。runメソッドは、新しいWindowsプロセスで実行されているプログラムを開始します。
プログラムの実行が終了するまでスクリプトを待たせてから続行することができます。これにより、スクリプトとプログラムを同時に実行することができます。
strCommandパラメータ内の環境変数は自動的に展開されます。
ファイルタイプがプログラムに正しく登録されている場合、そのタイプのファイルに対してRunメソッドが呼び出されると実行されます。例えば、コンピューターシステムにWordがある場合、*.docファイル上でRunメソッドを呼び出すと、Wordが起動し、文書が読み込まれます。
[intWindowStyleの説明]を参照してください。
0 ウィンドウを非表示にして、別のウィンドウをアクティブにします。
1 ウィンドウをアクティブにして表示します。ウィンドウを最小化または最大化した場合、システムはウィンドウを元のサイズと位置に復元します。アプリケーションは、ウィンドウを最初に表示するときにこのフラグを指定する必要があります。
2 ウィンドウをアクティブにして、最小化されたウィンドウとして表示する。
3 ウィンドウをアクティブにして、最大化ウィンドウとして表示します。
4 直近のウィンドウサイズと位置で表示する。アクティブなウィンドウはアクティブなままです。
5 ウィンドウをアクティブにして、現在のサイズと位置で表示する。
6 指定されたウィンドウを最小化し、Z順で次のトップウィンドウをアクティブにします。
7 最小化したウィンドウとして表示します。アクティブウィンドウはアクティブのままです。
8 ウィンドウを現在の状態として表示する。アクティブなウィンドウはアクティブなままです。
9 ウィンドウをアクティブにして表示する。ウィンドウが最小化または最大化されている場合、システムはそのウィンドウを元のサイズと位置に復元する。アプリケーションは、最小化されたウィンドウを復元するときにこのフラグを指定する必要があります。
10 アプリケーションを起動したプログラムの状態に基づいて、表示状態を設定する。
[例1]です。

次のVBScriptコードは、現在実行中のスクリプトのコピーをメモ帳に開きます。

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "%windir%\notepad " & WScript.ScriptFullName

次のVBScriptコードは、ウィンドウの種類を指定し、ユーザーがメモ帳を閉じるのを待ち、閉じるときにメモ帳から返されたエラーコードを保存する以外は、上記のコードと同じことをします。

<ブロッククオート

セット WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("notepad " & WScript.ScriptFullName, 1, true)

例2
次のVBScriptコードは、コマンドウィンドウを開き、パスをC: \に変更し、DIRコマンドを実行します。

Dim oShell
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "cmd /K CD C:\ & Dir"
Set oShell = Nothing

実行方法です。

Runメソッドには3つのパラメータがあります。
最初のパラメーターは、実行したいプログラムのパスです。
2番目のパラメータはウィンドウの形態で、0はバックグラウンドで実行、1は通常実行、2は最小化、3は最大化、デフォルトは通常実行を意味します。
3番目のパラメータは、スクリプトを待機させるか継続させるかを指定します。Trueに設定すると、スクリプトは呼び出し元のプログラムが終了するのを待ってから逆方向の実行を行います。

例1.

Set ws = CreateObject("WScript.Shell")
ws.Run "notepad",,True
ws.Run "iexplore"

例2:BATの実行ウィンドウを非表示にする

Set ws = CreateObject("WScript.Shell")
ws.Run "x.bat",0

例3.

Set ws = CreateObject("WScript.Shell")
ws.Run "cmd /c netstat -an>>x.txt",0

例4.

Set ws = CreateObject("WScript.Shell")
ws.Run "taskkill /f /im iexplore.exe",0

実行方法

例1: ファイルを実行する

セット ws = CreateObject("WScript.Shell")
ws.Exec "notepad c:/x.txt" 'Execはプログラムを指定する必要があり、このノートパッドは必須です。

例2.プログラムの実行>プロセスのPID値の取得>プロセスの強制終了(Run+taskkillほど強力ではない:メモ帳に保存せずにプロセスを終了すると、Execはエラーになるが、Runはならない)>プロセスが実行中かどうかを判断(これは良い機能です。)

Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("notepad")
MsgBox e.ProcessId
e.Terminate
WSH.Sleep 1000
MsgBox e.Status '0 is running, 1 is finished

例 3: dos コマンドの出力を直接取得、dos ウィンドウが点滅、Exec はウィンドウ制御なし

Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("ipconfig")
MsgBox e.Stdout.ReadAll

例4.

Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("cmd /c echo Hi")
MsgBox e.Stdout.ReadAll