如何在命令行参数中传递换行?

8

我加载了一个小型的控制台应用程序,它简单地读取并将传递给程序的第一个命令行参数打印到控制台。

我想传递一个新行符到参数中,我尝试了这个:

prog.exe \n  --> outputs \n
prog.exe "sfs \n sfff" --> outputs sfs \n sfff
prog.exe "ff \\n ff" --> outputs ff \\n ff
prog .exe "ff \\\\n ff" --> outputs ff \\\\n ff

我需要使用其他转义方式吗?还是我需要在输出到控制台之前对args [ 0 ]调用某些函数来处理已转义的字符?

为了澄清,我试图将一个带有换行符的字符串传递给我的程序。 将输出到控制台作为测试使用。 我也可以插入调试断点并检查变量的内容。


你想从命令行(cmd)或其他应用程序中调用你的prog.exe吗? - sloth
@BigYellowCactus,我从另一个应用程序接收到多行数据并将其存储在内存中。当我接收到足够的数据后,我希望正在接收数据的应用程序通过传递命令行参数来调用另一个程序。我不想使用平面文件作为中间步骤。根据其他人的建议,保留换行符很重要,因此我应该使用某种分隔符进行换行,并执行替换操作。 - user17753
4个回答

3
你遇到的问题是从命令行获取的字符串未编译。当你在代码中有字符串字面量时,它们会被编译,这时转义字符会被处理并转换为换行符等。你可能需要将输入字符串中所有"\n"的实例替换为换行符。 编辑:这里(稍作修改)可以使用CSharp编译器编译你的字符串,从而用适当的字符替换转义序列。
    public static string ParseString(string input)
    {
        var provider = new Microsoft.CSharp.CSharpCodeProvider();
        var parameters = new System.CodeDom.Compiler.CompilerParameters()
        {
            GenerateExecutable = false,
            GenerateInMemory = true,
        };

        var code = @"
        public class TmpClass
        {
            public static string GetValue()
            {
                return """ + input + @""";
            }
        }";

        var compileResult = provider.CompileAssemblyFromSource(parameters, code);

        if (compileResult.Errors.HasErrors)
        {
            throw new ArgumentException(compileResult.Errors.Cast<System.CodeDom.Compiler.CompilerError>().First(e => !e.IsWarning).ErrorText);
        }

        var asmb = compileResult.CompiledAssembly;
        var method = asmb.GetType("TmpClass").GetMethod("GetValue");

        return method.Invoke(null, null) as string;
    }

好的,我接受这个解决方案。虽然最终我并没有使用换行符,并采用了不使用命令行参数的不同方法,所以我实际上没有测试过这个答案... 呵呵 - user17753
@user17753 没关系。我看到了许多不同版本的相同问题,而我找到的答案比其他答案更好,因此问题仍然有用。 - N_A

2

在命令行参数中传递换行符会按预期工作。实际上,在 PowerShell 中进行快速测试:

PS> ./echoargs "a`nb" b c
arg 1: a
b
arg 2: b
arg 3: c

现在,如果你想在cmd中做同样的事情,那可能会很困难(而且从你的问题中并不明显 - Process.Start 可以工作,但需要一些技巧)。


我认为你误解了。我认为他字面上传递了“\n”。 - N_A
是的,他们不应该这样做。但是如果问题没有详细说明他们做了什么以及如何做,我们就无法真正帮助他们。我怀疑他们试图从 cmd 中传递 \n,但问题本身和标签都没有给出任何提示。 - Joey
他实际上指明了这一点:“我应该使用其他的转义吗?” 很明显,他期望''将'n'转换为换行符。 - N_A
谢谢你的建议,这是很有用的信息。虽然不完全是我的意思,但我编辑了我的问题以获得更清晰的表述。 - user17753

0

如果你传递 prog .exe "ff \\\\n ff"

你可以在代码内部替换它们,像这样 var s = arg[0].Replace("\" ,@"\\");


0
从Windows命令行来说,这是不可能的。基于安全考虑,C#会把用户输入的命令行当做完全字面意义来解析。除非您编写代码来遍历字符串并将\n替换为实际的换行符,否则没有转义字符可以自动创建新行。
如果您在命令行中键入\n,C#会将其解析为\\n

这是错误的。首先,在命令行(cmd.exe)中从命令行传递包含换行符的参数是完全可能的。其次,C# 不会解释任何东西。它只是一种语言,也不是解释型语言。 - sloth
在cmd.exe中,您可以使用转义字符^添加换行符。 - Vijay Chavda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接