我有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());
}
}
}
答案 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脚本无关的关联,我们可以在以后修复。