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

Optional. AppWinStyle。 从 AppWinStyle 指定要在其中运行程序的窗口样式中选择的值。 如果 Style 省略, Shell 请使用 AppWinStyle.MinimizedFocus,这将启动程序最小化并具有焦点。

Wait
Boolean

Optional. Boolean。 一个值,该值指示函数是否 Shell 应等待程序完成。 如果 Wait 省略, Shell 请使用 False

Timeout
Int32

Optional. Integer。 如果 WaitTrue,则等待完成的毫秒数。 如果 Timeout 省略, Shell 则使用 -1,这意味着没有超时,在 Shell 程序完成之前不会返回。 因此,如果省略 Timeout 或将其设置为 -1, Shell 则可能永远不会将控制权返回到程序。

返回

包含程序进程 ID(如果程序仍在运行)的整数。 如果程序已完成执行,则为 0。

例外

Style 不在 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 则返回程序的进程 ID。 进程 ID 是标识正在运行的程序的唯一数字。

未能启动

Shell如果函数无法启动命名程序,FileNotFoundException则会发生错误。 例如,尝试使用 command.com 从应用程序运行 16 位程序(如 System.Windows.Forms)时,可能会发生这种情况。 对于解决方法,可以运行调用所需 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 的文件,而不是在 C:\Program Files 目录中查找 display.exe

Important

如果不将路径和文件规范括在引号中,则文件名或路径节点包含空格时存在安全风险。 在前面的示例中,路径节点 \Program Files 包括一个空格。 如果规范不在引号内,并且 C:\中安装了名为 Program.exe 的程序,例如通过非法篡改,Windows将执行它,而不是 display.exe

Important

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

适用于

另请参阅