te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>.net - Subprocess redirected output is garbage - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

.net - Subprocess redirected output is garbage - Stack Overflow

programmeradmin3浏览0评论

I have an old .NET Framework 4.8 forms app and I am trying to add the ability to run the console version of VoidTools' excellent Everything, es.exe, in a subprocess but it is not working. The output is a bunch of chinese characters. The command parameter is the full path (which contains spaces) and filename of the exe and I've tried with and without double quotes. The command and parameters work fine in a normal command prompt.

Here is the code. Any ideas why?

Function ExecuteCommand(command As String, args As String) As String
    Dim processStartInfo As New ProcessStartInfo()
    processStartInfo.FileName = command
    processStartInfo.Arguments = args
    'processStartInfo.FileName = "cmd.exe"
    'processStartInfo.Arguments = " /c " & dblquoted(command) & " " & args
    processStartInfo.RedirectStandardOutput = True
    processStartInfo.RedirectStandardError = True
    processStartInfo.UseShellExecute = False ' This prevents a window from appearing
    processStartInfo.CreateNoWindow = True ' No window

    Dim process As New Process()
    process.StartInfo = processStartInfo

    Dim output As String
    Dim errorOutput As String

    Try
        process.Start()
        output = process.StandardOutput.ReadToEnd()
        errorOutput = process.StandardError.ReadToEnd()
        process.WaitForExit()
    Catch ex As Exception
        Return $"An error occurred: {ex.Message}"
    End Try

    ' Combine stdout and stderr for completeness
    Return output & Environment.NewLine & errorOutput
End Function

I have an old .NET Framework 4.8 forms app and I am trying to add the ability to run the console version of VoidTools' excellent Everything, es.exe, in a subprocess but it is not working. The output is a bunch of chinese characters. The command parameter is the full path (which contains spaces) and filename of the exe and I've tried with and without double quotes. The command and parameters work fine in a normal command prompt.

Here is the code. Any ideas why?

Function ExecuteCommand(command As String, args As String) As String
    Dim processStartInfo As New ProcessStartInfo()
    processStartInfo.FileName = command
    processStartInfo.Arguments = args
    'processStartInfo.FileName = "cmd.exe"
    'processStartInfo.Arguments = " /c " & dblquoted(command) & " " & args
    processStartInfo.RedirectStandardOutput = True
    processStartInfo.RedirectStandardError = True
    processStartInfo.UseShellExecute = False ' This prevents a window from appearing
    processStartInfo.CreateNoWindow = True ' No window

    Dim process As New Process()
    process.StartInfo = processStartInfo

    Dim output As String
    Dim errorOutput As String

    Try
        process.Start()
        output = process.StandardOutput.ReadToEnd()
        errorOutput = process.StandardError.ReadToEnd()
        process.WaitForExit()
    Catch ex As Exception
        Return $"An error occurred: {ex.Message}"
    End Try

    ' Combine stdout and stderr for completeness
    Return output & Environment.NewLine & errorOutput
End Function
Share Improve this question asked Feb 17 at 14:11 Dude named BenDude named Ben 5593 silver badges17 bronze badges 1
  • Oddly, it works fine as is on a console test project! – Dude named Ben Commented Feb 17 at 14:21
Add a comment  | 

1 Answer 1

Reset to default 1

Nice title .3.

Probably encoding issue, setting Encoding to UTF8 will probably solve the issue.

Try This:

processStartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8
processStartInfo.StandardErrorEncoding = System.Text.Encoding.UTF8
发布评论

评论列表(0)

  1. 暂无评论