簡體   English   中英

從命令行過程獲取所需輸出時出現問題

[英]Problems getting desired output from Command line process

我正在嘗試為lftp linux進程添加Windows本機通知。 為此,我試圖從c#控制台應用程序啟動命令以捕獲lftp的狀態。 問題是,如果我從c#啟動它與從bash運行它,則沒有相同的輸出。

我有一個幫助器類來進行命令行調用:

public static class ShellHelper
{
    public static void Bash(this string cmd)
    {
        var escapedArgs = cmd.Replace("\"", "\\\"");

        var process = new Process()
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "C:/cygwin64/bin/sh.exe",
                Arguments = $"-c \"{escapedArgs}\"",
                RedirectStandardError = true,
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true,
                StandardOutputEncoding = Encoding.UTF8,
                WindowStyle = ProcessWindowStyle.Hidden,
            }
        };

        process.OutputDataReceived += new DataReceivedEventHandler(ReadOutput);
        process.ErrorDataReceived += new DataReceivedEventHandler(ErrorOutput);

        process.Start();
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();
        process.WaitForExit();
    }

    private static void ErrorOutput(object sender, DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
            Console.WriteLine("Error: " + e.Data);
        }
    }

    private static void ReadOutput(object sender, DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
            Console.WriteLine(e.Data);
        }
    }
}

我的電話是:

ShellHelper.Bash("unbuffer lftp -p 22 -u login,password sftp://XXXXXXXXX -e \"set mirror:use-pget-n 20; mirror --parallel=3 -c -P5 /home29/qualinost/files/tests ./tests; quit; \"");

這是我從bash啟動命令時獲得的預期輸出

cd `/home29/qualinost/files/tests' [Connecting...]
cd `/home29/qualinost/files/tests' [Connected]      
`Kaamelott - S01E17 - Le Signe.mkv', got 0 of 48941955 (0%)
    ............................................................................................................................................................................................................................................
[A`Kaamelott - S01E17 - Le Signe.mkv', got 32768 of 48941955 (0%)
................................................................................    ................................................................................    .............................................................................
[A`Kaamelott - S01E17 - Le Signe.mkv', got 131072 of 48941955 (0%)  
................................................................................    ................................................................................    .............................................................................
[A`Kaamelott - S01E17 - Le Signe.mkv', got 458752 of 48941955 (0%) 235.7K/s
oo..............................................................................    ................................................................................    .............................................................................
[A`Kaamelott - S01E17 - Le Signe.mkv', got 720896 of 48941955 (1%) 265.0K/s   

這就是我從c#啟動相同命令時得到的:

cd `/home29/qualinost/files/tests' [Connecting...]
cd `/home29/qualinost/files/tests' [Connected]
`...1E17 - Le Signe.mkv', got 0 of 48941955 (0%)
`...1E17 - Le Signe.mkv', got 131072 of 48941955(0%)..........................
`...1E17 - Le Signe.mkv', got 917504 of 48941955 (1%) 598.5K/s.................
`...1E17 - Le Signe.mkv', got 1671168 of 48941955 (3%) 730.4K/s  ..............
`...1E17 - Le Signe.mkv', got 1900544 of 48941955 (3%) 734.7K/s   .............
`...1E17 - Le Signe.mkv', got 2588672 of 48941955 (5%) 650.1K/s   .............
`...1E17 - Le Signe.mkv', got 3473408 of 48941955 (7%) 727.3K/s   .............
`...1E17 - Le Signe.mkv', got 4096000 of 48941955 (8%) 718.8K/s   .............
`...1E17 - Le Signe.mkv', got 4816896 of 48941955 (9%) 747.9K/s   .............
`...1E17 - Le Signe.mkv', got 5668864 of 48941955 (11%) 954.0K/s  .............

如您所見,文件名被截斷。 我的猜測是它可能是緩沖區大小問題或某些c#不喜歡的特殊字符的編碼格式問題。

我還嘗試通過如下命令直接將輸出重定向到文件中:

ShellHelper.Bash("unbuffer lftp -p 22 -u login,password sftp://XXXXXX -e \"set mirror:use-pget-n 20; mirror --parallel=3 -c -P5 /home29/qualinost/files/tests ./tests; quit; \" > output.log");

但這是相同的,就像從bash中獲得的魅力一樣工作,但是當我從c#中啟動時缺少了部分。

關於這里發生的事情有什么想法嗎?

編輯:有人發表了評論(並刪除了它??),並指出“ c#”輸出行給我的最大字符數為80。他要求我使用

Console.SetWindowSize(400, 800);

在我的程序開始時,但沒有任何改變。 但是最大80個字符可能是一個有趣的說法!

編輯2:我用sed命令清理了lftp的輸出,以刪除進度條,僅獲取文件名及其進度。 但是當我從C#啟動腳本時,輸出仍然被截斷。 我用一個極短的文件名(yo.mkv)進行了測試,一切都在這里! 所以我認為這絕對是StandardOutput的緩沖區大小問題。 有沒有辦法定義此緩沖區的更大大小?

我終於找到了關於此損壞的MS異步輸出重定向的解決方法。 我使用此代碼https://stackoverflow.com/a/13860551/1502444能夠通過在不同線程中使用StandardOutput.Read()方法並更改讀取緩沖區大小來讀取輸出的每個字符。 感謝這個解決方案和raterus的作者指出了異步讀取問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM