C#命令行参数含换行在C#中失败,但在Python中正常。如何让C#生效?

5 投票
1 回答
1307 浏览
提问于 2025-04-17 04:39

环境:.NET 3.5,使用Visual Studio 2008 SP1,运行在Win XP SP3上,Python 2.7。公司电脑,没有管理员权限。

在C# 3.5中,我想给一个命令行程序传递一个参数,这个参数里包含换行符。在Python 2.7中可以正常工作,但在C#中却不行。

当内容包含换行符时,C#会截断结果,而Python则能正确传递。

Python代码:

cmd = self.app_path + ' email -Subject "' + subject + '" -From "' + address_from + '" -To "' + address_to +'" -Body "' + body +'"'
cmd_result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()

C#代码:

string Command = "<path to executable>";                 
string arguments = "  email -From " + FromAddress + " -To " + ToAddress + " -Subject \"" + SubjectLine + "\" -Body \"" + emailBody + "\" ";
System.Diagnostics.ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo(Command, arguments);
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
start.CreateNoWindow = false;
start.UseShellExecute = true;
System.Diagnostics.Process process = System.Diagnostics.Process.Start(start);

有没有什么想法?

更新:Python示例中的body和C#示例中的emailBody包含相同的字符串,因为在每种语言中字符串的表示方式是一样的。

更新:注意到Python代码中的命令没有正确结束。我在第二行的末尾加了+ '"'。代码运行和之前一样。

另外,正如你所看到的,调用的应用程序会将body(emailBody)参数的内容作为邮件正文发送。

1 个回答

2

抱歉,我觉得是你调用的过程没有正确传递参数;这和C#没有关系,以下是证明:

  • 创建一个新的Windows窗体应用程序
  • 确保你的Main方法的格式看起来像这样:

    static void Main(string[] args)
    
  • 确保你调用主窗体(命名为Form1)的方式是这样的:

        if (args==null)
        {
            Application.Run(new Form1()); 
        }
        else
        {
            Application.Run(new Form1(args)); 
        }
    
  • 在你的窗体上添加一个文本框,并将多行属性设置为真

  • 在你的窗体上添加一个按钮

  • 运行一次应用程序

  • 然后在你的button1_Click函数的代码中放入这个(替换当前应用的名称):

        string Command = "TheNameOfTheCurrentApp";                 
        string arguments = textBox1.Text;
        System.Diagnostics.ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo(Command, arguments);
        start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        start.CreateNoWindow = true;
        start.UseShellExecute = true;
        System.Diagnostics.Process process = System.Diagnostics.Process.Start(start);        
    
  • 在你的窗体中添加这个构造函数:

    public Form1(string[] args)
    {
        InitializeComponent();
        textBox1.Text = string.Join(" ", args);
    }
    
  • 然后运行你的应用,往文本框中输入多行内容,点击按钮。相同的应用会出现,文本框会正确显示换行的内容

撰写回答