【问题标题】:passing new lines in command line argument?在命令行参数中传递新行?
【发布时间】:2012-07-11 03:34:51
【问题描述】:

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

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

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
  • @BigYellowCactus 基本上,我从另一个应用程序将几行数据接收到内存中,在收到足够多的数据后,我希望正在接收的应用程序通过传递这些行来调用另一个程序命令行参数。我不想有一个平面文件中间步骤。根据人们所说,维护新行很重要,我想我应该为换行使用某种分隔符并执行替换操作。

标签: c# .net-4.0 command-line-arguments


【解决方案1】:

您遇到的问题是您从命令行获得的字符串没有被编译。当您的代码中有字符串文字时,它们会被编译,这是处理转义字符并将其转换为换行符等的时候。您可能需要做一些事情,例如用换行符替换输入字符串中的所有“\n”实例。

编辑:

来自here(稍作修改),这将使用 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 没关系。我看到了同一个问题的许多不同版本,我找到的答案比其他答案更好,所以这个问题仍然有用。
【解决方案2】:

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

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

现在,如果您正在尝试在 cmd 中做同样的事情,这可能会很困难(并且从您的问题中并不是很明显 - Process.Start 会起作用)。

【讨论】:

  • 我想你误会了。我认为他实际上是在传递“\n”。
  • 是的,他们不应该那样做。但如果没有真正详细说明他们的什么以及如何的问题,我们就无法真正帮助他们。我怀疑他们尝试从cmd 内部传递\n,但问题和标签都没有暗示这一点。
  • 他确实明确指出了这一点:“还有其他一些我想使用的转义吗?”很明显,他希望 '\' 将 'n' 转换为换行符。
  • 感谢您的提示,这是有用的信息。不过,这并不完全是我要去的地方。为了清楚起见,我编辑了我的问题。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 这是错误的。首先,完全可以将参数传递给包含命令行内换行符的 Windows 命令行应用程序 (cmd.exe)。其次,C# 不解释任何东西。这是一种语言。而且也不是解释的。
    • 可以在cmd.exe中使用转义符^添加换行符
    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2020-08-24
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    相关资源
    最近更新 更多