我加载了一个小型控制台应用程序,只需读取并打印传递给程序的第一个命令行参数即可。
我想将换行符传递给我试过的参数:
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]来处理转义字符才能将其输出到控制台?
为了澄清,我正在尝试将字符串传递给我的程序,其中包含换行符。输出到控制台被用作测试。我可以轻松地插入调试中断行并检查变量的内容。
答案 0 :(得分:3)
您遇到的问题是您从命令行获得的字符串不会被编译。当你的代码中有字符串文字时,它们就会被编译,这就是当处理转义字符并转换成换行符等时。你可能需要做一些事情,比如用输入字符替换输入字符串中的所有“\ 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;
}
答案 1 :(得分:2)
在命令行参数中传递换行符实际上按预期工作。 PowerShell中的快速测试:
PS> ./echoargs "a`nb" b c
arg 1: a
b
arg 2: b
arg 3: c
现在,如果你正在尝试的是在cmd
中做同样的事情,这可能会很困难(并且从你的问题中看不是很明显 - Process.Start
会起作用。)
答案 2 :(得分:1)
从Windows命令行,这是不可能的。为了安全起见,C#从命令行解析用户输入完全是文字的。除非您编写代码以遍历字符串并将\n
替换为实际的换行符,否则没有可自动创建换行符的转义字符。
如果在命令行中输入\n
,C#会将其解析为\\n
。
答案 3 :(得分:0)
如果您通过prog .exe "ff \\\\n ff"
您可以在代码var s = arg[0[.Replace("\" ,@"\\");
内替换它们