Post by Vincent BelaïchePost by Vincent Belaïche[...]
Post by ralphPost by Vincent BelaïcheRdub
Redirecting to a file won't do it. My VB script is run itself from a
console with csscript, and I would like the output of the sub-shell
run console application to be run in the same console.
Console (A)
+-------- VB script (B)
+---- sub-shell with console application (C)
I would like the standard output of `B' and `C' to be displayed in the
same scrollable screen that is part of `A'.
Still not clear to me, but browse for "Shell and Wait". You'll find
examples for VB as well as VBS.
If necessary have each subsquent app write to a file, then 'echo' that
output from A to the screen.
-ralph
Hello Ralph,
Actually I do not need some specific code to achieve "Shell And Wait",
this is already supported by WshShell with the 3rd argument of the Run
method.
Set http://msdn.microsoft.com/en-us/library/aew9yb99(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/d5fk67ky(v=VS.85).aspx#CommunityContent
'---------------------------- myscript.vbs ----------------------------
Dim oShell, iReturn
Set oShell = WScript.CreateObject("WScript.Shell")
Const iACTIVATE_AND_DISPLAY = 1
iReturn = oShell.Run("calc.exe",iACTIVATE_AND_DISPLAY, True)
WScript.Echo "The end!"
'----------------------------------------------------------------------
In this example you will have the echo "The end!" only after exiting
calc.exe, so I do have a wait.
What I would like is that if I launch this script (let's call it
Rem -------------------------------------------------------------------
cscript myscript.vbs
Rem -------------------------------------------------------------------
Then any output made to the standard output by the application (C) goes
to the same DOS window (A) under which I launched cscript (B), just
like "The end!" is output by the script (B) to this DOS window (A).
Note that in the example above the application (C) is is just calc.exe
but in reality that would be some console application.
Hopefully my question is clear now...
Vincent.
Hello,
I have found a way to allmost achieve what I am seeking for (in the
'-----------------temp.vbs --------------------------------------------
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
Dim oExec
Set oExec = oShell.Exec("TREE.COM")
Dim sLine
Do While True
Do While Not oExec.StdOut.AtEndOfStream
sLine = oExec.StdOut.ReadLine
WScript.Echo sLine
Loop
If oExec.Status = 1 Then
Exit Do
Else
WScript.Sleep 100
End if
Loop
WScript.Echo "That's all!"
'----------------------------------------------------------------------
But that does not work properly with non ASCII characters. You can try
in a DOS console to type TREE, and then CSCRIPT temp.vbs and see the
difference.
Any idea how to solve this ?
Vincent.
Yup!
First stop with the wscript. You can do it all in classic VB.
Create a new form and put a command button and a text box in it.
Change the Multi line prop of the text box to true.
Change the font prop of the text box to one that has the old DOS line
drawing characters. I used the Windows Terminal Font.
Paste in this code (Watch for line wraping)
-=-=-=-=-=-=-=-=-=-=-= Code starts -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Const STATUS_PENDING = &H103&
Private Const PROCESS_QUERY_INFORMATION = &H400
Public Function ShellandWait(ExeFullPath As String, _
Optional TimeOutValue As Long = 0, _
Optional WindowStyle As VbAppWinStyle = vbMinimizedNoFocus) As Boolean
Dim lInst As Long
Dim lStart As Long
Dim lTimeToQuit As Long
Dim sExeName As String
Dim lProcessId As Long
Dim lExitCode As Long
Dim bPastMidnight As Boolean
On Error GoTo ErrorHandler
lStart = CLng(Timer)
sExeName = ExeFullPath
'Deal with timeout being reset at Midnight
If TimeOutValue > 0 Then
If lStart + TimeOutValue < 86400 Then
lTimeToQuit = lStart + TimeOutValue
Else
lTimeToQuit = (lStart - 86400) + TimeOutValue
bPastMidnight = True
End If
End If
lInst = Shell(sExeName, WindowStyle)
lProcessId = OpenProcess(PROCESS_QUERY_INFORMATION, False, lInst)
Do
Call GetExitCodeProcess(lProcessId, lExitCode)
DoEvents
If TimeOutValue And Timer > lTimeToQuit Then
If bPastMidnight Then
If Timer < lStart Then Exit Do
Else
Exit Do
End If
End If
Loop While lExitCode = STATUS_PENDING
ShellandWait = True
Exit Function
ErrorHandler:
ShellandWait = False
End Function
Private Sub Command1_Click()
Dim fh As Integer
If Not ShellandWait("cmd /c Tree c:\dell > c:\dell\rw.txt", , vbHide) Then
MsgBox "Error attempting to start tree.com!", vbExclamation, "Error"
End If
fh = FreeFile
Open "c:\dell\rw.txt" For Input As #fh
Text1.Text = Input(LOF(fh), #fh)
Close #fh
End Sub
-=-=-=-=-=-=-=-=-=-=-= Code ends -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Fix up all of the string literals I used in this example to stuff that
works on your system.
Rdub