我加载了一个小型控制台应用程序,它只是读取并打印传递给程序的第一个命令行参数到控制台。
我想将换行符传递给我尝试过的参数:
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] 来处理转义字符?
为了澄清,我试图将一个字符串传递给我的程序,其中包含换行符。输出到控制台被用作测试。我可以轻松插入调试断行并检查变量的内容。
您遇到的问题是从命令行获取的字符串未编译。当代码中有字符串文字时,它们会被编译,此时转义字符会被处理并转换为换行符等。您可能需要执行一些操作,例如替换“的所有实例” " 在输入字符串中带有换行符。
编辑:
从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;
}
实际上,在命令行参数中传递换行符可以按预期工作。在 PowerShell 中快速测试:
PS> ./echoargs "a`nb" b c
arg 1: a
b
arg 2: b
arg 3: c
现在,如果您正在尝试在
cmd
中做同样的事情,这可能会很困难(并且从您的问题中并不是很明显 – Process.Start
会起作用)。
如果你通过了
prog .exe "ff \\\\n ff"
您可以像这样从代码内部替换它们
var s = arg[0[.Replace("\" ,@"\\");
从 Windows 命令行中,这是不可能的。为了安全起见,C# 将命令行中的用户输入完全解析为文字。没有转义字符会自动创建新行,除非您编写代码来遍历字符串并将
\n
替换为实际的换行符。
如果您在命令行中输入
\n
,C# 会将其解析为 \\n
。
对于 python,您可以用引号括起实际的换行符。示例:
# test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('name', type=str)
args = parser.parse_args()
print(args.name)
print([args.name])
以换行符作为参数调用:
$ python test.py "hello
world"
输出:
hello
world
['hello\nworld']