Re: VBScript halts with out error message

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



T Lavedas schrieb:
On Apr 20, 11:48 am, Dan <D...@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote:
I cahnged the call line to:

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "D:\BatchJobs\WebSiteSync\Sync.bat",0,bWaitOnReturn

But despite numerous arrangements of the .run line with varied parameters,
it will not wait for the called job to complete before it goes on to the next
line.

"Pegasus [MVP]" wrote:

"Dan" <D...@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:F4697881-9ED9-4829-9791-1B5D87249F0F@xxxxxxxxxxxxxxxx
I have a script that creates and calls a batch file. It runs through 17
commands and then freezes. If I exit the script and run the batch file it
created, it runs fine. The command lines are based on IIS websites. If I
remove the websites surrounding the point of failure and run the script,
it
still processes exactly 17 command (which is also 17 websites.) Any
ideas?
Here is the script:
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8
Set fso = CreateObject("Scripting.FileSystemObject")
Set strFile = fso.OpenTextFile("D:\BatchJobs\WebSiteSync\sites.txt",
ForReading)
Set strCommand = fso.OpenTextFile("D:\BatchJobs\WebSiteSync\Sync.bat",
ForWritting)
set strLog = fso.openTextFile("D:\BatchJobs\WebSiteSync\msdeploysync.log",
ForWritting)
strLog.WriteLine Date() & " " & Time()
strLog.WriteLine "Calling Creation of Web Site List"
Dim oWsc, oExec
Set oWsc = CreateObject("WScript.Shell")
Set oExec = oWsc.Exec("D:\BatchJobs\WebSiteSync\CreateList.bat")
' wait until finished
Do While oExec.Status <> 1
WScript.Sleep 100
Loop
strLog.WriteLine err.number & " " & err.description
err.number = 0
strLog.WriteLine
strLog.WriteLine "Reading WebSites"
strLog.WriteLine
strCommand.WriteLine "msdeploy -verb:sync -source:appPoolConfig
-dest:appPoolConfig,computerName=IISServer2"
Do Until strFile.AtEndOfStream
s = strFile.ReadLine
x = Instr(s, chr(34))
if x > 0 then
SiteName = right(s, len(s) - x)
end if
y = Instr(SiteName, chr(34))
if y > 0 then
SiteName = left(SiteName,y-1)
end if
if SiteName <> "Default Web Site" then
strCommand.WriteLine "msdeploy -verb:sync -source:apphostconfig=" &
chr(34) & SiteName & chr(34) & ",includeAcls=true -dest:apphostconfig=" &
chr(34) & SiteName & chr(34) & ",computerName=IISServer2 -debug -verbose
D:\BatchJobs\WebSiteSync\msdeploysync.log"
end if
loop
strLog.WriteLine "Calling Sync.bat"
strLog.WriteLine
strFile.Close
strCommand.Close
strLog.close
Set oExec = oWsc.Exec("D:\BatchJobs\WebSiteSync\Sync.bat")
Do While oExec.Status <> 1
WScript.Sleep 30000
Loop
set strLog = fso.openTextFile("D:\BatchJobs\WebSiteSync\msdeploysync.log",
ForAppending)
strLog.WriteLine "Finished at " & Date() & " " & Time()
strLog.close
The Exec method is not suitable when you need to wait until a shell command
has completed its operation. Use the Run method instead - it accepts an
optional parameter bWaitOnReturn.

Dan,

First, you need to define the value of bWaitOnReturn: True means wait
and false (default) means don't wait. Commonly this is done with a
literal, rather than a variable (unless it is programatically
important to be a variable). So, you probably want ...

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "D:\BatchJobs\WebSiteSync\Sync.bat",0,True

However, the Exec.Status checks and looping you had in your original
script should have worked in fundamentally the same way. Therefore, I
must conclude that the underlying operations contained in your batch
procedures are the source of your problem. Since you didn't post
those, it's hard to be sure, but from your description, I can't
imagine anything else. Specifically, if an application invoked in one
or more of the batch files is a Win32 application or is launching an
additional thread and then terminating, the batch procedures would end
and return control to your script, even while the application
continues to run. To get this behavior under control, a START
statement to launch the offending application(s) in the batch may be
all that is needed. However, it might be harder than that.

I think some insight into the batch procedures may be needed to solve
your problem.

Tom Lavedas
***********
http://there.is.no.more/tglbatch/

If you use:

'' starter.vbs - start [a]sync.bat

Option Explicit

Dim sCmd : sCmd = ".\sync.bat"
Dim oWSH : Set oWSH = CreateObject( "WScript.Shell" )
Dim oWAN : Set oWAN = WScript.Arguments.Named

If oWAN.Exists( "async" ) Then sCmd = ".\async.bat"

WScript.Echo "starter started"
WScript.Echo "starting", sCmd
Dim iRet : iRet = oWSH.Run( "%comspec% /c " & sCmd, 1, True )
WScript.Echo "iRet =", iRet
WScript.Echo "starter terminated"
WScript.Quit 0

to start either:

@ECHO OFF
REM sync.bat - running worker.vbs

ECHO sync.bat started
ECHO running worker.vbs
cscript worker.vbs 10000
ECHO sync.bat terminated

for a synchron run or

@ECHO OFF
REM async.bat - kicking off worker.vbs

ECHO async.bat started
ECHO kicking off worker.vbs
start cscript worker.vbs 10000
ECHO sync.bat terminated

for an asynchron kick off of:

'' worker.vbs - working for some time

Option Explicit

Dim nSleeps : nSleeps = 5000
Dim oWAU : Set oWAU = WScript.Arguments.UnNamed

If 1 = oWAU.Count Then
If IsNumeric( oWAU( 0 ) ) Then
nSleeps = CInt( oWAU( 0 ) )
End If
End If

WScript.Echo "Worker started"
Dim nStep : nStep = nSleeps \ 5
Do Until nSleeps < 0
WScript.Echo "Working ..."
WScript.Sleep nStep
nSleeps = nSleeps - nStep
Loop
WScript.Echo "worker terminated"
WScript.Quit 0

you get a live demonstration of Tom's theoretical explanation.
.



Relevant Pages

  • Re: Persisting env vars in cmd windows
    ... But the piece de resistance was the "start" command, ... - Have all code for the one project in one single batch file. ... @echo off ... echo:: ERROR ERROR ERROR ERROR ...
    (microsoft.public.win2000.general)
  • Re: Batch File to manipulate path and file name
    ... It should process any "poison" characters ... # echo Full name=%%a ... If you object to requiring two files to achieve your aim (one batch, ... How do I get from Input File Name to Output File Name Desired? ...
    (microsoft.public.windowsxp.general)
  • Re: File Size Check
    ... the batch ended and was done. ... del para2.txt ... echo open ... SLEEP is part of the WinNT/2K/XP/2003 Resource Kit and not a ...
    (microsoft.public.scripting.vbscript)
  • Re: del not working in .bat file
    ... Haven't managed yet to do away with the .bat file and run this: ... Try using the CALL command inside the batch file. ... @echo off ... executes, which calls test2.bat and that executes. ...
    (microsoft.public.vb.general.discussion)
  • Re: del not working in .bat file
    ... Try using the CALL command inside the batch file. ... @echo off ... executes, which calls test2.bat and that executes. ...
    (microsoft.public.vb.general.discussion)