首页 文章

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

提问于
浏览
112

我知道我已经回答了类似的问题(Running Batch File in background when windows boots up),但这次我需要启动批处理:

  • 来自另一批,

  • 没有显示任何控制台窗口,

  • 将所有参数传递给不可见批处理 .

第一批在控制台窗口中执行 . 但是,我不希望第二批(由 asynchronous way 中的第一批启动)也显示控制台窗口 .

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

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


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

  • 从控制台窗口中的第二个脚本开始,_1366627就足够了 .

  • 在Windows中,没有触发第二个窗口,我的解决方案仍然有效 .

8 回答

  • 0

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

    can 使用 start /b second.bat从您的第一个批处理文件 a 同步启动第二个批处理文件's window. If both batch files write to the console simultaneously, the output will be overlapped and probably indecipherable. Also, you'想要在第二个批处理文件的末尾添加 exit 命令,或者您将在第二个 cmd shell内一切都完成了 .

  • 108

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

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

    wscript.exe invis.vbs run.bat %*
    

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

    • 脚本的[路径] \名称

    • 脚本所需的所有其他参数( %*

    然后,invis.vbs将使用Windows Script Host Run() method调用您的脚本,其中包含:

    • intWindowStyle:0表示"invisible windows"

    • 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
    
  • 8

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

  • 2

    我认为这是在不打开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文件名和路径 .

  • 51

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

    1)即使在旧的win 95/98机器上也可以使用 IEXPRESS 解决方案 . 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 /批处理混合,带有一些Jscript和一些VBScript代码 - 但它返回已启动进程的PID . 如果进程未被隐藏可以使用某些选项,如X / Y坐标(不适用于每个可执行文件 - 但例如cmd.exe接受坐标) .

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

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

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

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

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

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

    启动它的批处理文件可能看起来像这样(未经测试):

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

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

    你必须download the Windows 2003 Resource Kit才能得到它 . Resource Kit也可以安装在其他版本的Windows上,例如Windows XP .

  • 12

    使用“runas”或在Windows Scheduled Tasks中的其他用户下安排它,在不同的用户名下运行它 .

  • 2

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

相关问题