0

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

另一方面,如果我提供 exe 路径StartInfo.FileName和脚本文件路径,StartInfo.Argument那么我不会出错。例如:我想执行 powershell 脚本并将以下属性设置为P1.StartInfo.FileName = "location of powershell.exe"and 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());
      }

    }
  }
4

2 回答 2

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();
    }
于 2012-06-06T11:09:01.273 回答
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 脚本相关联,我们可以稍后修复。

于 2012-06-06T09:05:57.870 回答