我正在尝试将运行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()
答案 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