9

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

我想将换行符传递给我尝试过的参数:

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] 来处理转义字符吗?

为了澄清,我试图将一个字符串传递给我的程序,其中包含换行符。输出到控制台被用作测试。我可以很容易地插入一个调试中断行并检查变量的内容。

4

4 回答 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;
    }
于 2012-07-11T13:45:36.587 回答
2

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

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

现在,如果您正在尝试做同样的事情,cmd那可能会很困难(并且从您的问题中并不是很明显——Process.Start尽管如此)。

于 2012-07-11T13:45:56.993 回答
0

如果你通过prog .exe "ff \\\\n ff"

您可以var s = arg[0[.Replace("\" ,@"\\");像这样从代码中替换它们

于 2012-07-11T13:46:17.617 回答
0

从 windows 命令行,这是不可能的。为了安全起见,C# 将来自命令行的用户输入完全解析为文字。没有转义字符会自动创建一个新行,除非您编写代码来遍历字符串并替换\n为实际的换行符。

如果您在\n命令行中输入,C# 会将其解析为\\n.

于 2012-07-11T13:50:16.787 回答