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 に答える