Windows XP or later Windows: How can I run a batch file in the background with no window displayed?

VonC picture VonC · Nov 18, 2008 · Viewed 121.9k times · Source

I know I have already answered a similar question (Running Batch File in background when windows boots up), but this time I need to launch a batch:

  • from another batch,
  • without any console window displayed,
  • with all arguments passed to the invisible batch.

The first batch is executed in a console window. However, I do not want the second batch (launched by the first in a asynchronous way) to also display a console window.

I have come up with a VBScript script which does just that, and I put the script as an answer for others to refer to, but if you have other ideas/solutions, feel free to contribute.

Note: The console window of Windows command processor is named not really correct DOS window by many people.


Thank you all for the answers. From what I understand, if I need to asynchronously call a script to run in an invisible mode:

  • From a second script already in a console window, start /b is enough.
  • From Windows, without triggering a second window, my solution is still valid.

Answer

VonC picture VonC · Nov 18, 2008

Here is a possible solution:

From your first script, call your second script with the following line:

wscript.exe invis.vbs run.bat %*

Actually, you are calling a vbs script with:

  • the [path]\name of your script
  • all the other arguments needed by your script (%*)

Then, invis.vbs will call your script with the Windows Script Host Run() method, which takes:

  • intWindowStyle : 0 means "invisible windows"
  • bWaitOnReturn : false means your first script does not need to wait for your second script to finish

Here is invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False