Interaction.Shell(String, AppWinStyle, Boolean, Int32) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
运行一个可执行程序,并且如果该程序仍在运行则返回一个包含该程序的进程 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
. 如果 Wait
为 True
,则为等待完成的毫秒数。 如果省略 Timeout
,则 Shell
使用 -1,表示没有超时设置并且 Shell
到程序结束时才返回。 因此,如果省略 Timeout
或将其设置为 -1,则 Shell
可能永远不会将控制返回给您的程序。
返回
一个整数,包含该程序仍在运行时的进程 ID。 如果该程序已完成执行,则为 0。
例外
Style
不在 0 到 9(包含 0 和 9)范围内。
Shell
找不到 PathName
文件。
PathName
为 Nothing
。
示例
以下示例使用 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
返回值取决于返回时Shell
中PathName
名为 的程序是否仍在执行。 如果将 设置为 Wait
True
,并且程序在超时到期之前完成, Shell
则 返回零。 如果超时过期,或者如果省略 Wait
或将其设置为 False
, Shell
则返回程序的进程 ID。 进程 ID 是标识正在运行的程序的唯一数字。
无法启动
如果函数 Shell
无法启动命名程序,则 FileNotFoundException 会发生错误。 例如,当你尝试使用 System.Windows.Forms从应用程序中运行 16 位程序(如 command.com
)时,可能会发生这种情况。 若要解决此问题,可以运行调用所需 16 位程序的 32 位程序。 对于 command.com
,可以运行 cmd.exe
作为替代项。
等待完成
默认情况下, Shell
函数以异步方式运行程序。 这意味着,在函数后面的Shell
语句执行之前,Shell
以 函数启动的程序可能无法完成执行。 如果要等待程序完成,然后再继续,请将 设置为 Wait
True
。
确定退出代码
进程可以在终止时返回 退出代码 。 但是,不能使用 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 和代码访问权限。