Interaction.Shell(String, AppWinStyle, Boolean, Int32) 方法

定義

執行可執行程式,並在它仍在執行中時傳回一個整數 (整數中包含此程式的處理序 ID)。

public static int Shell (string PathName, Microsoft.VisualBasic.AppWinStyle Style = Microsoft.VisualBasic.AppWinStyle.MinimizedFocus, bool Wait = false, int Timeout = -1);
public static int Shell (string Pathname, Microsoft.VisualBasic.AppWinStyle Style = Microsoft.VisualBasic.AppWinStyle.MinimizedFocus, bool Wait = false, int Timeout = -1);
static member Shell : string * Microsoft.VisualBasic.AppWinStyle * bool * int -> int
static member Shell : string * Microsoft.VisualBasic.AppWinStyle * bool * int -> int
Public Function Shell (PathName As String, Optional Style As AppWinStyle = Microsoft.VisualBasic.AppWinStyle.MinimizedFocus, Optional Wait As Boolean = false, Optional Timeout As Integer = -1) As Integer
Public Function Shell (Pathname As String, Optional Style As AppWinStyle = Microsoft.VisualBasic.AppWinStyle.MinimizedFocus, Optional Wait As Boolean = false, Optional Timeout As Integer = -1) As Integer

參數

PathNamePathname
String

必要。 String. 要執行的程式名稱,以及任何必要的引數和命令列參數。 PathName 也可包含磁碟機和目錄路徑或資料夾。
如果您不知道此程式的路徑,可以使用 GetFiles 來尋找。 例如,您可以呼叫 My.Computer.FileSystem.GetFiles("C:", True, "testFile.txt"),它會傳回磁碟驅動器 C:\上任何位置名為 testFile.txt 之每個檔案的完整路徑。

Style
AppWinStyle

選擇性。 AppWinStyle. 選自 AppWinStyle 的值,可指定此程式執行所在之視窗的樣式。 如果省略 Style,則 Shell 會使用 AppWinStyle.MinimizedFocus (其會以最小化狀態啟動程式,並具有焦點)。

Wait
Boolean

選擇性。 Boolean. 值,表示 Shell 函式是否應該等候程式完成。 如果省略 Wait,則 Shell 會使用 False

Timeout
Int32

選擇性。 Integer. 如果 WaitTrue,則為等候完成的毫秒數。 如果省略 Timeout,則 Shell 會使用 -1,這表示沒有逾時,且 Shell 要等到程式完成後才會傳回。 因此,如果您省略 Timeout 或是將它設定為 -1,則 Shell 有可能永遠都不會將控制權傳回給您的程式。

傳回

包含此程式處理序識別碼的整數 (如果它仍在執行中)。 如果程式已完成執行則為 0。

例外狀況

Style 不在 0 到 9 的範圍內 (含 0 和 9)。

Shell 找不到 PathName 檔案。

PathNameNothing

範例

下列範例會使用函 Shell 式來執行使用者指定的應用程式。 AppWinStyle.NormalFocus指定為第二個自變數會以正常大小開啟應用程式,並讓它成為焦點。

Dim procID As Integer
' Run calculator.
procID = Shell("C:\Windows\system32\calc.exe", AppWinStyle.NormalFocus)
' The preceding path is for Windows XP.
' The Windows 2000 path is C:\WINNT\system32\calc.exe.

備註

函式的 Shell 傳回值取決於中 PathName 名為的程式是否仍在傳回時 Shell 執行。 如果您設定 WaitTrue ,且程式在逾時到期之前完成,則 Shell 傳回零。 如果逾時過期,或者如果您省略 Wait 或將它設定為 FalseShell 則會傳回程式的進程標識碼。 進程標識碼是識別執行中程式的唯一數位。

無法啟動

如果函 Shell 式無法啟動具名程式, FileNotFoundException 就會發生錯誤。 例如,當您嘗試從使用System.Windows.Forms的應用程式執行16位程式時,可能會command.com發生這種情況。 如需因應措施,您可以執行呼叫所需 16 位程式的 32 位程式。 如果是 command.com,您可以以替代方式執行 cmd.exe

等候完成

根據預設,函式會 Shell 以異步方式執行程式。 這表示從函式開始 Shell 的程式在執行函式之後 Shell 的語句之前,可能無法完成執行。 如果您要等候程式在繼續之前完成,請將 設定 WaitTrue

判斷結束代碼

進程可以在結束時傳回 結束代碼 。 不過,您無法使用 Shell 來擷取這個結束代碼,因為它 Shell 在等候終止時傳回零,也因為進程在 Shell與不同的物件中執行。

若要從進程擷取結束代碼,您必須撰寫自己的程式代碼來起始進程並等候終止。 下列範例示範如何起始進程、等候它終止,以及擷取其結束代碼。

Dim procID As Integer  
Dim newProc As Diagnostics.Process  
newProc = Diagnostics.Process.Start("C:\WINDOWS\NOTEPAD.EXE")  
procID = newProc.Id  
newProc.WaitForExit()  
Dim procEC As Integer = -1  
If newProc.HasExited Then  
    procEC = newProc.ExitCode  
End If  
MsgBox("Process with ID " & CStr(ProcID) & _  
    " terminated with exit code " & CStr(procEC))  

保護檔案規格

您應該一律以引弧括住整個路徑和檔案規格,如下列範例所示。

ID = Shell("""C:\Program Files\display.exe"" -a -q", , True, 100000)  

字串常值內每個相鄰雙引號 (" ") 都會解譯為字串中的一個雙引號字元。 因此,上述範例會將下列字串呈現給 Shell 函式:

"C:\Program Files\display.exe" -a -q  

如果您沒有以引弧括住的路徑,Windows 會在 C:\ 目錄中尋找名為 Program.exe 的檔案,而不是 display.exe 在 C:\Program Files 目錄中尋找。

重要

如果您未以引弧括住路徑和檔案規格,如果檔名或路徑節點包含空格,就會有安全性風險。 在上述範例中,路徑節點 \Program Files 包含空格。 如果規格不在引號內,且名為 Program.exe 的程式已在 C:\中安裝,例如,透過非法竄改,Windows 會執行它,而不是 display.exe

重要

Shell 式需要 Unmanaged 程式代碼許可權,這可能會在部分信任的情況下影響其執行。 如需詳細資訊,請參閱 SecurityPermission程式碼存取權限

適用於

另請參閱