这里回答calling a ruby script in c#
但这样做有用吗?我尝试了这个,但它一直失败“系统找不到指定的文件”错误,我假设它是因为文件名之前的ruby命令,但我不太确定。
感谢您的帮助
答案 0 :(得分:4)
您也可以尝试使用IronRuby执行类似
的Ruby代码using System;
using Microsoft.Scripting.Hosting;
using IronRuby;
class ExecuteRubyExample
{
static void Main()
{
ScriptEngine engine = IronRuby.Ruby.CreateEngine();
engine.ExecuteFile("C:/rubyscript.rb");
}
}
答案 1 :(得分:1)
链接的答案看起来相当合适,但显然不适合你。这意味着它可能是两件事之一。
1)反斜杠咬你。尝试更改
ProcessStartInfo info = new ProcessStartInfo("ruby C:\rubyscript.rb");
到
ProcessStartInfo info = new ProcessStartInfo(@"ruby C:\rubyscript.rb");
或
ProcessStartInfo info = new ProcessStartInfo("ruby C:\\rubyscript.rb");
第一个更改使用字符串文字,第二个更改正确地转义反斜杠。
2)环境路径没有将Ruby的bin目录导出到它。这不太可能,更难以测试,所以我会专注于第一个。
答案 2 :(得分:0)
这是我运行红宝石脚本的代码。
using (var proc = new Process())
{
var startInfo = new ProcessStartInfo(@"ruby");
startInfo.Arguments = filePath;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
proc.StartInfo = startInfo;
proc.Start();
}
此方法运行asynchronously
,因为脚本可能花费未知的时间来运行,这允许main
thread
继续运行而不锁定它,然后等待脚本在返回Task
之前完成运行。
private async Task RunRubyScript(string filePath)
{
await Task.Run(() =>
{
using (var proc = new Process())
{
var startInfo = new ProcessStartInfo(@"ruby");
startInfo.Arguments = filePath;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
proc.StartInfo = startInfo;
proc.Start();
proc.WaitForExit();
}
});
}
希望这会有所帮助!
答案 3 :(得分:0)
试试这个
void runScript()
{
using (Process p = new Process())
{
ProcessStartInfo info = new ProcessStartInfo("ruby");
info.Arguments = "C:\rubyscript.rb args"; // set args
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
p.StartInfo = info;
p.Start();
string output = p.StandardOutput.ReadToEnd();
// process output
}
}