在 c# 中将数据传递到孩子的 STDIN

本文关键字:孩子 STDIN 数据 | 更新日期: 2023-09-27 18:33:31

我是C#和Perl的新手,但是我已经用其他语言编程了几年了。但无论如何,我一直在尝试编写一个简单的程序,通过其 STDIN 将值从 C# 程序传递给 Perl 脚本。C#程序可以很好地打开Perl脚本,但我似乎找不到一种将"1"传递给它的方法。最好的方法是什么?我已经四处寻找解决方案,但没有运气......

C# 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace OpenPerl
{
    class Program
    {
        static void Main(string[] args)
        {
            string path ="Z:''folder''test.pl";
            Process p = new Process();
            Process.Start(path, @"1");
        }
    }
}

Perl 程序

#!/usr/bin/perl
use strict;
use warnings;
print "Enter 1: ";
my $number=<STDIN>;
if($number==1)
{
    print "You entered 1'n'n";
}

在 c# 中将数据传递到孩子的 STDIN

试试这个:

my ($number)=@ARGV;

而不是:

my $number=<STDIN>;

来自perldoc:"数组@ARGV包含用于脚本的命令行参数。

您正在将命令行参数传递给perl脚本,而不是通过Process.Start(string,string)的用户输入。

尝试打印 perl 脚本收到的@ARGV,您应该能够看到 1。

如果您希望 perl 脚本通过 STDIN(标准)接收其输入,C# 端将如下所示:

Process p = new Process();
p.StartInfo.FileName = path;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.Start();
p.StandardInput.WriteLine("1");

RedirectStandardInput 需要设置UseShellExecute,但它可能会阻止 perl 脚本正常启动。 在这种情况下,请设置FileName="<path to perl.exe>"Arguments="<path to script.pl>"