VB管道从cmd.exe输出STDOUT到写入文本框

时间:2012-04-01 23:12:26

标签: vb.net

我正在尝试将运行QWINSTA命令的VBscript调整为我定义为数组的文本文件,并将结果显示在文本文件中。

在查看Stack和其他站点上的大量示例之后,这是我的最新迭代,它显示除了STDOUT之外的所有内容,这正是我所追求的,不确定这是否是我如何调用命令管道的问题输出或什么。我也将两个变量作为参数传递给复杂的事情:)

FOR循环完成后,stdout传送到的文本文件为空 我可能会走很远的路,我过去的大部分经验都是在BATCH

For Each server In RemotePC

        'The Query is launched
        Dim Query As New ProcessStartInfo

        Query.WorkingDirectory = "c:\"
        Query.Arguments = server & " " & profile & " >C:\Windows\Temp\SFOUT.txt"
        Query.FileName = "QWINSTA"
        Query.WindowStyle = ProcessWindowStyle.Hidden
        Process.Start(Query)

        'Call Shell("QWINSTA /SERVER:" & server & " " & profile & " >C:\Windows\Temp\SFOUT.txt", vbHidden, Timeout:=5000)


        Dim SFOUT As New IO.StreamReader("C:\windows\temp\SFOUT.txt")

        'Results are Echoed to TextboxResults
        TextBoxResults.Text &= "__________________________________________________________" & ControlChars.CrLf
        TextBoxResults.Text &= server & ControlChars.CrLf
        TextBoxResults.Text &= SFOUT.ReadToEnd & ControlChars.CrLf
        SFOUT.Close()

    Next

以下是VBscript中的工作代码

For Each server In RemotePC


Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set StrDir = "QWINSTA /SERVER:" & server & " " & profile


'The Query is launched
Set oExec = WshShell.Exec(StrDir)


'We wait for the end of process
Do While oExec.Status = 0
WScript.Sleep 500
Loop

'We scan and only display the command output of commands without NULL output
Do While oExec.StdOut.AtEndOfStream <> True
      Results.WriteLine("__________________________________________________________")
        Results.WriteLine(server)
        Results.WriteLine oExec.StdOut.ReadLine
Loop



NEXT

感谢任何帮助

@Nilpo

这就是我回来的原因

SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 

console Matt 1 Active

我使用QWINSTA构建了类似于此的东西,并批量管道输出,它运行完美,只是有问题适应这一点。


这是我尝试的最后一件事我尝试通过调用notepad.exe等基本内容来简化操作,甚至尝试定义环境变量,认为它不是在读取%PATH%,以回复@Nilpo

Dim Query As New Process

        Query.StartInfo.FileName = "notepad.exe"
        'Query.StartInfo.Arguments = server & " " & profile & " >C:\Windows\Temp\SFOUT.txt"
        Query.StartInfo.UseShellExecute = False
        Query.StartInfo.RedirectStandardOutput = True
        Query.StartInfo.WindowStyle = ProcessWindowStyle.Normal

        Environment.SetEnvironmentVariable("PATH", "%PATH%;" & "C:\Windows\System32\notepad.exe")

        Query.Start()

1 个答案:

答案 0 :(得分:0)

输出重定向后应该有一个空格。

Query.Arguments = server & " " & profile & " >C:\Windows\Temp\SFOUT.txt"

应该是

Query.Arguments = server & " " & profile & " > C:\Windows\Temp\SFOUT.txt"

话虽如此,我唯一能看到的可能不起作用的是这里。

Query.WorkingDirectory = "c:\"    
Query.Arguments = server & " " & profile & " >C:\Windows\Temp\SFOUT.txt"    
Query.FileName = "QWINSTA"    
Query.WindowStyle = ProcessWindowStyle.Hidden    
Process.Start(Query)

我不确定你是否可以这种方式使用参数。当你的输出重定向真的不是时,你的输出重定向被读作文字参数。在命令行环境中,它被解释为单独的命令,而不是第一个命令的参数。这与管道非常相似。在代码中将此作为参数提供可能无法按预期工作。您可能希望返回Call Shell方法。这将执行命令,就好像它在命令行上一样。

[编辑]

我是对的。以下是使用您的方法执行此操作的正确方法。

Query.WorkingDirectory = "c:\"
Query.Arguments = server & " " & profile & " >C:\Windows\Temp\SFOUT.txt"
Query.FileName = "QWINSTA"
Query.WindowStyle = ProcessWindowStyle.Hidden

'Redirect output
Query.UseShellExecute = False
Query.RedirectStandardOutput = True

Process.Start(Query)

'Read the output
Dim output As String = Process.StandardOutput.ReadToEnd
' wait for the process to terminate 
Process.WaitForExit