Vb.net 相互排斥的变通办法”;使用ShellExecute";及;重定向标准输出“;

Vb.net 相互排斥的变通办法”;使用ShellExecute";及;重定向标准输出“;,vb.net,visual-studio,perl,Vb.net,Visual Studio,Perl,我需要一个解决方法,它将在互斥的UseShellExecute和RedirectStandardOutput上使用True,并具有相同的效果。 我之所以需要它,是因为我想通过CMD.exe执行perl脚本: perl perlcompare.pl <file1> <file2> <file3> 这门语言和学习都很陌生,所以我会寻找你给我的任何线索。我不明白你为什么要将UseShellExecute设置为true。它必须为false才能允许重定向标准IO通道

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

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

这门语言和学习都很陌生,所以我会寻找你给我的任何线索。

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

如果perl编译器可执行文件的位置在PATH中,那么您可以将
文件名设置为
perl
。最好使用
String.Format
从变量中构建字符串,而不是使用所有转义引号和串联

Dim myProcess作为新的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}”“”,
主文件,
主输出,
比较(输出)
myProcess.StartInfo.RedirectStandardOutput=True
myProcess.Start()

如果perl编译器的位置不在路径中,则可以将完全限定的文件路径放入
文件名

,使
myProcess.StartInfo.Arguments
看起来很可怕。@simbabque:Visual Basic是一种可怕的语言。没有变量插值,您可以通过将双引号加倍来避免双引号。此外,串联运算符是与
&
。所有这些都会让你看起来一团糟,尽管
“&”和“
可能只是
。最好使用
String.Format
这是VB的
sprintf
@Borodin很久以前,我买了一个大约200分米的VisualBasic5Einsteiger版本盒,并对它进行了黑客攻击。那是在我学习QuickBasic之后不久,在我拿起我的第一本Perl书之前。然而,我仍然认为它很丑陋。辛巴布:你和我们其他人一样,也有一个被浪费的年轻人!微软的VB和C语言让我很恼火,它们不是为了提高编程技术,而是为了把人们锁定在他们的产品中。如果要捕获输出,则需要启用重定向。要执行简单的Perl脚本,您不需要使用系统shell,尽管您可能需要指定Perl的完整路径或设置其他变量。
    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.