【问题标题】:Batch file called from .Net doesn't run从 .Net 调用的批处理文件不运行
【发布时间】:2014-09-18 15:43:50
【问题描述】:

我正在尝试从我的 Vb.Net 应用程序运行批处理文件。 VS 2010 针对 .Net 4。

在 Windows XP 下运行良好。

在 Windows 8 下,我按预期得到了 UAC 提示符,我看到命令窗口短暂出现,但立即消失,批处理文件中的命令似乎都没有执行。

我尝试用单个pause 命令替换批处理文件,但窗口仍然会消失而无需等待输入。 这是我的代码:

    processStartInfo = New System.Diagnostics.ProcessStartInfo()
    processStartInfo.FileName = Script  ' batch file name

    If My.Computer.Info.OSVersion >= "6" Then  ' Windows Vista or higher
        ' required to invoke UAC
        processStartInfo.Verb = "runas"
    End If

    processStartInfo.Arguments = Join(Parameters, " ")
    processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
    processStartInfo.UseShellExecute = True

    process = System.Diagnostics.Process.Start(processStartInfo)

【问题讨论】:

  • 将“暂停”添加到 .bat 文件的末尾,以便您可以阅读错误消息。永远不要忘记检查 Process.ExitCode 以便诊断完全失败。
  • @Hans 正如我在问题中所说,我用一个暂停命令替换了整个批处理文件,但窗口立即消失了。我也许可以尝试查看 Process.ExitCode,但我假设正在显示命令窗口(尽管非常简短),该进程似乎已启动正常。我不希望我的代码等待该过程完成,尽管出于调试目的我也许可以暂时这样做。
  • 如果您重命名 .bat 以使其找不到,Process.Start 应该抛出“找不到文件”异常。会这样吗?
  • 你的源代码sn-p对我们来说完全没用。批处理文件存储在哪里,在本地磁盘上还是在服务器上?批处理文件是否使用完整的路径和名称调用?是否使用了 UNC 路径或映射的网络驱动器路径?批处理或 .NET 应用程序的当前工作目录是什么?为什么我这么问?尝试使用 UNC 路径手动在服务器上运行具有当前工作目录的批处理文件,您会得到答案。
  • 对不起,你说得对,我应该包含生成批处理文件名的代码。我不认为问题在于它没有找到文件。它与主 exe 和包含此代码的 dll 位于同一目录中。我正在使用我使用的完整路径:My.Application.Info.DirectoryPath

标签: .net vb.net visual-studio-2010 batch-file


【解决方案1】:

好的。问题似乎是 cmd.exe 对其参数的处理方式不同,具体取决于它们是否包含引号字符。为了解决这个问题。我直接调用 cmd.exe 而不是使用 ShellExecute,并将整个命令用引号括起来。

Dim script As String = My.Application.Info.DirectoryPath & "\Test.bat"
RunCommand(script, """a quoted string""", "string2")

Private Function RunCommand(Script As String, ParamArray Parameters() As String) As Boolean

    Dim process As System.Diagnostics.Process = Nothing
    Dim processStartInfo As System.Diagnostics.ProcessStartInfo
    Dim OK As Boolean

    processStartInfo = New System.Diagnostics.ProcessStartInfo()
    processStartInfo.FileName = """" & Environment.SystemDirectory & "\cmd.exe" & """"

    If My.Computer.Info.OSVersion >= "6" Then  ' Windows Vista or higher
        ' required to invoke UAC
        processStartInfo.Verb = "runas"
    End If

    processStartInfo.Arguments = "/C """"" & Script & """ " & Join(Parameters, " ") & """"
    processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
    processStartInfo.UseShellExecute = False

    'MsgBox("About to execute the following command:" & vbCrLf & processStartInfo.FileName & vbCrLf & "with parameters:" & vbCrLf & processStartInfo.Arguments)
    Try
        process = System.Diagnostics.Process.Start(processStartInfo)
        OK = True
    Catch ex As Exception
        MsgBox(ex.ToString, MsgBoxStyle.Exclamation, "Unexpected Error running update script")
        OK = False
    Finally
        If process IsNot Nothing Then
            process.Dispose()
        End If
    End Try

    Return OK

End Function

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 2014-07-03
    • 2012-12-18
    • 2011-10-29
    • 2012-08-07
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多