Path: csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder3.hal-mli.net!feeder.erje.net!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Ron Weiner Newsgroups: comp.lang.basic.visual.misc Subject: Re: Redirecting VB script sub shell standard output Date: Tue, 11 Oct 2011 21:04:55 -0400 Organization: WorksRite Lines: 214 Message-ID: References: <80zkh9rkje.fsf@gmail.com> <804nzhtme6.fsf@gmail.com> <8062jwxfm2.fsf@gmail.com> <80aa97jmm4.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 8bit Injection-Date: Wed, 12 Oct 2011 01:04:57 +0000 (UTC) Injection-Info: mx04.eternal-september.org; posting-host="mbzwzvtzsOQbWhr5uq4uFA"; logging-data="15330"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18r0bg0I6d4ET2NvoFAdZKL" X-Newsreader: MesNews/1.08.03.00-gb Cancel-Lock: sha1:KQa6KjMkqw/aP4aMNI/eQwlMZzw= X-ICQ: 543516788 Xref: x330-a1.tempe.blueboxinc.net comp.lang.basic.visual.misc:478 Vincent Belaïche has brought this to us : > vincent.belaiche@gmail.com (Vincent Belaïche) writes: > >> ralph writes: >> >>> On Mon, 10 Oct 2011 08:02:09 +0200, vincent.belaiche@gmail.com >>> (Vincent Belaïche) wrote: >>> >>>> Ron Weiner writes: >> >> [...] >> >>>>> Rdub >>>> >>>> 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 >> >> see also: >> http://msdn.microsoft.com/en-us/library/d5fk67ky(v=VS.85).aspx#CommunityContent >> >> Here is an example: >> '---------------------------- 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 >> myscript.vbs) with the DOS command: >> >> 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 > example below the console application is TREE.COM): > > '-----------------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