解决方法互斥“UseShellExecute”和“RedirectStandardOutput”

时间:2017-03-14 15:00:04

标签: vb.net visual-studio perl

我需要一种解决方法,它与在互斥的UseShellExecute和RedirectStandardOutput上使用True具有相同的效果。 我需要这个的原因是因为我想通过CMD.exe执行我的perl脚本:

perl perlcompare.pl <file1> <file2> <file3>

注意将“perl”放在前面似乎是可选的,因为该文件已经是.pl文件。

我想访问运行给出的输出,因为可能存在对用户很重要的错误消息(例如丢失文件)。还有另一种方法可以达到这个目的吗?

    Dim myProcess As New System.Diagnostics.Process
    myProcess.StartInfo.WorkingDirectory = "K:\Engineering\Temp\perl"
    myProcess.StartInfo.UseShellExecute = True
    myProcess.StartInfo.FileName = "perlcompare.pl"
    myProcess.StartInfo.Arguments = """" & MasterFile & """" & " " & """" & MasterOutput & """" & " " & """" & ComparisonsOutput & """"
    myProcess.StartInfo.RedirectStandardOutput = True
    myProcess.Start()

    Dim sOutput As String
    Using ProcessStreamReader As System.IO.StreamReader = myProcess.StandardOutput
        sOutput = ProcessStreamReader.ReadToEnd()
    End Using

    MessageBox.Show(sOutput)   'txtOutput being the output textbox.

语言和学习方面的新手,所以我会为你找到任何线索。

1 个答案:

答案 0 :(得分:3)

我不明白为什么要将UseShellExecute设置为 true 。它必须是 false 才能允许重定向标准IO通道

如果perl编译器可执行文件的位置在PATH中,那么您只需将FileName设置为perl即可。使用String.Format从变量构建字符串而不是使用所有那些转义的引号和连接也更好

Dim myProcess As New System.Diagnostics.Process
myProcess.StartInfo.WorkingDirectory = "K:\Engineering\Temp\perl"
myProcess.StartInfo.UseShellExecute = False
myProcess.StartInfo.FileName = "perl"
myProcess.StartInfo.Arguments = String.Format(
        "perlcompare.pl ""{0}"" ""{1}"" ""{2}""",
        MasterFile,
        MasterOutput,
        ComparisonsOutput)
myProcess.StartInfo.RedirectStandardOutput = True
myProcess.Start()

如果perl编译器的位置不在PATH中,那么您可以将完全限定的文件路径放入FileName