Windows XP或更高版本Windows:如何在后台运行batch file而不显示窗口?

我知道我已经回答了一个类似的问题( 在Windows启动时在后台运行batch file ),但这次我需要启动批处理:

  • 从另一批次,
  • 没有显示任何控制台窗口,
  • 将所有参数传递给不可见的批处理。

第一批在控制台窗口中执行。 不过,我不希望第二批(以asynchronous方式第一批启动)也显示一个控制台窗口。

我已经想出了一个VBScript脚本,并将脚本作为其他人参考的答案 ,但如果您有其他想法/解决scheme,请随时投稿。

注意:Windows命令处理器的控制台窗口被很多人命名为不正确的DOS窗口。


谢谢大家的答案。 从我的理解,如果我需要asynchronous调用一个脚本运行在一个不可见的模式:

  • 从控制台窗口中的第二个脚本start /b就足够了。
  • 从Windows, 没有触发第二个窗口 ,我的解决scheme仍然有效。

你需要第二个batch fileasynchronous运行吗? 通常一个batch file与call命令同步运行,第二个将共享第一个窗口。

可以使用start /b second.bat从您的第一个共享您的第一个窗口同步启动第二个batch file。 如果这两个batch file同时写入到控制台,输出将被重叠并可能无法解读。 此外,您还需要在第二个batch file的末尾放置一个exit命令,否则一旦完成任务,您将在第二个cmd shell中。

这是一个可能的解决scheme:

从你的第一个脚本中,用以下行调用你的第二个脚本:

 wscript.exe invis.vbs run.bat %* 

其实,你正在调用一个vbs脚本:

  • 脚本的[path] \名称
  • 你的脚本需要的所有其他参数( %*

然后,invis.vbs将使用Windows Script Host Run()方法调用您的脚本,该方法需要:

  • intWindowStyle:0意味着“不可见的窗口”
  • bWaitOnReturn:false表示您的第一个脚本不需要等待第二个脚本完成

这里是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 

将batch file转换为exe。 尝试蝙蝠到exe转换器或在线蝙蝠到exe转换器 ,并select该选项运行它作为一个鬼应用程序,即没有窗口。

这里是我实现这个目标的方法集合 – 甚至更多 – 我已经试着返回已启动进程的PID(所有链接的脚本都可以下载,并以任何你感兴趣的名字保存):

1) IEXPRESS解决scheme甚至可以在旧式的胜利95/98机器上使用。 Iexpress是一个非常古老的工具,仍然与Windows打包在一起 – 因为参数只接受命令及其参数。

用法示例:

 call IEXPhidden.bat "cmd /c myBat.bat" "argument" 

2) SCHTASKS – 再次接受只有两个参数 – 命令和arguments.Also检查它是否以提升的权限开始,如果可能的话获得进程的PID与WEVTUTIL(从Vista和以上版本可用,所以较新版本的Windows将收到PID)命令。

用法示例:

 call SCHPhidden.bat "cmd /c myBat.bat" "argument" 

3) 'WScript.Shell' – 脚本是'WScript.Shell'的完整包装,每个可能的选项都可以通过命令行选项设置。它是一个jscript /批量混合,可以被称为蝙蝠。

使用示例(更多信息,请打印“-h”帮助):

 call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' – 又一个完整的包装和所有选项都可以通过命令行参数访问。这次是WSF /批量混合一些Jscript和一些VBScript的代码 – 但它返回启动process.If进程的PID没有隐藏一些选项,如X / Y坐标可以使用(不适用于每个可执行文件 – 但例如cmd.exe接受坐标)。

使用示例(更多信息,请打印“-h”帮助):

 call win32process.bat "notepad" -arguments "/A openFile.txt" -showWindows 0 -title "notepad" 

5)。 NET解决scheme 。 ProcessStartInfo选项的大部分选项都被使用(但最后我太累了,不能包含所有的东西):

用法示例(有关详细信息,请使用'-h'打印帮助):

 call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt" -style Hidden -directory "." -title "notepad" -priority Normal 

我认为这是运行batch file而不打开DOS窗口的最简单和最短的解决scheme,当你想安排一组定期运行的命令时,它会非常分散注意力,所以DOS窗口不断popup,这里是你的解决scheme。 使用VBS脚本调用batch file…

 Set WshShell = CreateObject("WScript.Shell" ) WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 Set WshShell = Nothing 

将上面的行复制到一个编辑器中,并用.VBS扩展名保存该文件。 相应地编辑.BAT文件名称和path。

在另一个问题,我build议autoexnt 。 在这种情况下也是可以的。 只需将服务设置为手动运行(即在启动时不自动)。 如果要运行批处理,请修改autoexnt.bat文件以调用所需的batch file,然后启动autoexnt服务。

开始这个batch file,可以看起来像这样(未经testing):

 echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat net start autoexnt 

请注意,以这种方式启动的batch file以系统用户身份运行,这意味着您无法自动访问networking共享。 但是您可以使用net use连接到远程服务器。

您必须下载Windows 2003资源工具包来获取它。 资源工具包也可以安装在其他版本的Windows上,如Windows XP。

在不同的用户名下使用“runas”或在Windows Scheduled Tasks中的其他用户下进行安排。

您可以通过.vbs文件运行.bat文件
将以下代码复制到.vbs文件中:

 Dim WshShell Dim obj Set WshShell = WScript.CreateObject("WScript.Shell") obj = WshShell.Run("C:\Users\file1.bat", 0) obj = WshShell.Run("C:\Users\file2.bat", 0) and so on set WshShell = Nothing