Process.StartInfo.UseShellExecute相关错误

时间:2012-06-06 08:55:41

标签: c# .net

我有1个c#console appln,它使用Process.Start()方法执行任何脚本文件。我提供了Process1.StartInfo.FileName的脚本文件路径。我的脚本文件可以是任何类型(.vbs,ps1等)。我也使用指令p.StartInfo.Arguments将String传递给脚本。当脚本文件执行时,它应该将字符串返回到c#应用程序。可以通过设置Process1.StartInfo.RedirectStandardOutput = true来读取此返回的字符串,但是为了使用此指令,我需要设置Process1.StartInfo.UseShellExecute = false。  当我运行这个我得到错误“指定的可执行文件不是一个有效的Win32应用程序”。  我想这可能是因为,当我设置Process1.StartInfo.UseShellExecute = false时,我的应用程序不知道用于执行脚本文件的.exe。

另一方面,如果我提供StartInfo.FileName的exe路径和StartInfo.Argument的脚本文件路径,那么我没有收到错误。 例如:我想执行powershell脚本,并将以下属性设置为P1.StartInfo.FileName = "location of powershell.exe"p1.startInfo.Argument =".ps1 script file path",在这种情况下我没有收到错误。

问题是我事先不知道,我将执行哪种类型的脚本。也无法找到.exe文件的位置,以便在不同的不同m / c上执行脚本文件。那么是否可以从相同的公共c#appln执行不同类型的脚本文件,还可以读取脚本返回的输出?

这是我的代码

 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Diagnostics;
 using System.Collections;
 namespace process_csharp
 {
    class Program
    {
       static void Main(string[] args)
       {
        String path = null;
        //this will read script file path 
        path = Console.ReadLine();

        //this string is passed as argument to script
        string s = "xyz";

        Process p = new Process();          
        p.StartInfo.FileName= path;         
        p.StartInfo.Arguments = s;                     
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;      

        p.Start();
        p.BeginOutputReadLine();
        Console.WriteLine(p.StandardOutput.ReadToEnd());
      }

    }
  }

2 个答案:

答案 0 :(得分:2)

您可以检查脚本类型并从他们自己的引擎读取输出;

    static void Main(string[] args)
    {
        string path = Console.ReadLine();
        string parameter = Console.ReadLine();
        string enginePath;
        switch (Path.GetExtension(path).ToLowerInvariant())
        {
            case ".ps1":
                enginePath = "powershell.exe";
                break;
            case ".vbs":
                enginePath = "cscript.exe";
                break;
            default:
                throw new ApplicationException("Unknown script type");
        }

        string scriptPath = path;
        Process process = new Process();
        process.StartInfo.FileName = enginePath;
        process.StartInfo.Arguments = string.Format("{0} {1}", scriptPath, parameter);
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.Start();
        Console.WriteLine(process.StandardOutput.ReadToEnd());
        Console.ReadKey();
    }

答案 1 :(得分:1)

请尝试使用此代码:

string path = @"C:\mypsscript.bat";
Process p = new Process();
p.StartInfo.FileName = path;
p.StartInfo.Arguments = "xyz";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
Console.WriteLine(p.StandardOutput.ReadToEnd());
Console.ReadKey();

对于调试的问题,我创建了一个包含以下代码的批处理文件:

echo %1

当我运行上面的代码时,我得到:

xyz

所以这似乎工作正常。尝试使用这样的批处理文件并查看它是否有效,如果是,它可能是与PowerShell脚本无关的关联,我们可以在以后修复。