Windows XP或更高版本Windows:如何在后台运行批处理文件而不显示窗口?

Von*_*onC 118 windows cmd wsh batch-file

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

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

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

我已经提出了一个VBScript脚本,它就是这样做的,我把脚本作为其他人参考答案,但如果你有其他的想法/解决方案,请随时贡献.

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


谢谢大家的答案.根据我的理解,如果我需要异步调用脚本以在隐形模式下运行:

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

Von*_*onC 109

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

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

wscript.exe invis.vbs run.bat %*
Run Code Online (Sandbox Code Playgroud)

实际上,您正在使用以下命令调用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
Run Code Online (Sandbox Code Playgroud)

  • 2k视图和一个伟大的帖子+答案,更多的人应该投票这个线程 (3认同)

P D*_*ddy 53

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

可以使用start /b second.bat推出第二批文件,一个从你的第一个共享您的第一个窗口同步.如果两个批处理文件同时写入控制台,则输出将重叠并且可能难以辨认.此外,您需要exit在第二个批处理文件的末尾放置一个命令,或者cmd一旦完成所有内容,您将在第二个shell中.


Rob*_*Kam 12

将批处理文件转换为exe.尝试Bat To Exe ConverterOnline Bat To Exe Converter,并选择将其作为ghost应用程序运行,即无窗口.

  • 我通常不是那种偏执狂,但让一个匿名的人为我生成那个exe并不是非常愚蠢的吗?可以注入各种恶意内容. (19认同)
  • 可能,但我会尽量避免在这种情况下采取任何额外步骤. (3认同)

ind*_*ago 9

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

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

将上面的行复制到编辑器并使用.VBS扩展名保存文件.相应地编辑.BAT文件名和路径.


npo*_*aka 7

以下是我实现这一目标的方法 - 甚至更多 - 我可能已经尝试返回启动过程的PID(所有链接的脚本都可以下载并以您认为方便的名称保存):

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

用法示例:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"
Run Code Online (Sandbox Code Playgroud)

2)SCHTASKS - 再次只接受两个参数 - 命令和参数.还检查它是否以提升的权限启动,如果可能的话,使用WEVTUTIL获取进程的PID(可从Vista及以上版本获得,因此较新版本的Windows将接收PID)命令.

用法示例:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"
Run Code Online (Sandbox Code Playgroud)

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

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

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 
Run Code Online (Sandbox Code Playgroud)

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

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

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"
Run Code Online (Sandbox Code Playgroud)

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

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

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
Run Code Online (Sandbox Code Playgroud)