Windows XP或更高版本Windows:如何在没有窗口显示的情况下在后台运行批处理文件?


121

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

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

第一批在控制台窗口中执行。但是,我不希望第二批(以异步方式由第一批启动)也显示控制台窗口。

我已经提出了一个VBScript脚本,它可以做到这一点,并且我将该脚本作为他人参考答案,但是如果您有其他想法/解决方案,请随时贡献。

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


谢谢大家的回答。据我了解,如果我需要异步调用脚本以在不可见模式下运行:

  • 从已经在控制台窗口中的第二个脚本中start /b就足够了。
  • 从Windows,无需触发第二个窗口,我的解决方案仍然有效。

您是从另一个批处理文件启动该批处理文件吗?这个已经运行的批处理文件是否有一个窗口?
奇怪的

是的,这另一个(第一个)批处理是在DOS窗口中执行的。但是,我不希望第二批(以异步方式由第一批启动)也显示一个窗口(用“ start / b”命令会发生)
VonC

Answers:


53

您是否需要第二个批处理文件才能异步运行?通常,一个批处理文件与call命令同步运行另一个文件,而第二个将共享第一个文件的窗口。

可以使用start /b second.bat从第一个批处理文件同步启动第二个批处理文件,文件共享第一个批处理文件的窗口。如果两个批处理文件同时写入控制台,则输出将重叠并且可能无法识别。另外,您需要exit在第二个批处理文件的末尾放置一个命令,否则cmd,一切完成后您将进入第二个shell。


1
正确。我相信start / b会打开一个新窗口,但是如果从DOS窗口执行,它将共享相同的窗口。
VonC

110

这是一个可能的解决方案:

在第一个脚本中,使用以下代码行调用第二个脚本:

wscript.exe invis.vbs run.bat %*

实际上,您正在使用以下命令调用vbs脚本:

  • 脚本的[路径] \名称
  • 脚本(%*)所需的所有其他参数

然后,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

3
2k的浏览量以及不错的帖子+答案,更多的人应该对此主题投票
Ric Tokyo 2009年

很好的解决方案,正是我所需要的。
nikhil 2012年

唯一的问题是,这将创建一个名为“ cmd.exe”的进程,以后很难找到它。
Aditya Gupta,

12

将批处理文件转换为exe。尝试Bat To Exe ConverterOnline Bat To Exe Converter,然后选择将其作为Ghost应用程序运行的选项,即没有窗口。


3
可能的,但是在这种情况下,我将尽量避免采取任何其他措施。
VonC

21
我通常不是那种偏执狂,但是让某人匿名为我生成该exe会不是很愚蠢?各种各样的恶意东西都可以被注入。
Tobias

9

我认为这是在不打开DOS窗口的情况下运行批处理文件的最简单,最短的解决方案,当您要安排一组定期运行的命令时,这可能会非常分散您的注意力,因此DOS窗口不断弹出,这是您的解决方案。使用VBS脚本调用批处理文件...

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

将以上各行复制到编辑器中,并以.VBS扩展名保存文件。相应地编辑.BAT文件名和路径。


1
有趣的方法,肯定比我的解决方案要短。+1
VonC 2014年

很好的解决方案。阅读这个 [我已通知有没有真的需要使用Set WshShell = Nothing,为我工作得很好,你可以有一个更小的方式来做到这一点。
帕特里克·巴德2014年

7

这是我实现该目标的方法的集合-甚至更多-在可能的情况下,我也尝试返回已启动进程的PID(所有链接的脚本都可以下载并以您认为方便的任何名称保存):

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

用法示例:

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

2)SCHTASKS-再次仅接受两个参数-命令和参数,还检查它是否以提升的权限启动,并在可能的情况下使用WEVTUTIL获取进程的PID(可从Vista及更高版本获得,因此较新版本的Windows将收到PID)命令。

用法示例:

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

3)'WScript.Shell'-脚本是'WScript.Shell'的完整包装,可以通过命令行选项设置所有可能的选项,它是jscript / batch的混合体,可以称为bat。

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

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

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

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

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

5)。NET解决方案。使用了大多数ProcessStartInfo选项(但是最后,我太累了,无法包含所有内容):

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

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

2

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

启动该文件的批处理文件可能如下所示(未调试):

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

请注意,以这种方式启动的批处理文件以系统用户身份运行,这意味着您无权自动访问网络共享。但是您可以使用net use连接到远程服务器。

您必须下载Windows 2003 Resource Kit才能获得它。资源工具包也可以安装在Windows的其他版本上,例如Windows XP。


1
有趣的是,但在这种情况下过分严格了。
VonC

2

在Windows Scheduled Tasks中,使用“ runas”或在其他用户下以其他用户名运行它。


可能,但不完全是我的要求(后台直接异步调用)
VonC

0

您可以通过.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 

0

您也可以使用

start /MIN notepad.exe

PS:不幸的是,最小化的窗口状态取决于要运行的命令。VG不起作用

start /MIN calc.exe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.