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 中选择的一个值,该值指定将要在其中运行程序的窗口的样式。 如果省略 StyleShell 将使用 AppWinStyle.MinimizedFocus 以最小化方式启动该程序并获得焦点。

Wait
Boolean

可选。 Boolean. 一个指示 Shell 函数是否应等待程序完成的值。 如果省略 Wait,则 Shell 将使用 False

Timeout
Int32

可选。 Integer. 如果 WaitTrue,则为等待完成的毫秒数。 如果省略 Timeout,则 Shell 使用 -1,表示没有超时设置并且 Shell 到程序结束时才返回。 因此,如果省略 Timeout 或将其设置为 -1,则 Shell 可能永远不会将控制返回给您的程序。

返回

一个整数,包含该程序仍在运行时的进程 ID。 如果该程序已完成执行,则为 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返回值取决于返回时ShellPathName名为 的程序是否仍在执行。 如果将 设置为 WaitTrue ,并且程序在超时到期之前完成, Shell 则 返回零。 如果超时过期,或者如果省略 Wait 或将其设置为 FalseShell 则返回程序的进程 ID。 进程 ID 是标识正在运行的程序的唯一数字。

无法启动

如果函数 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 包含一个空格。 如果规范不在引号内,并且已在 C:\中安装了名为 Program.exe 的程序(例如通过非法篡改),则 Windows 将执行它而不是 display.exe

重要

函数 Shell 需要非托管代码权限,这可能会影响其在部分信任情况下的执行。 有关详细信息,请参阅 SecurityPermission代码访问权限

适用于

另请参阅