代码之家  ›  专栏  ›  技术社区  ›  VonC

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

  •  132
  • VonC  · 技术社区  · 17 年前

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

    • 从另一批中,
    • 在没有显示任何控制台窗口的情况下,
    • 所有的论点 传递给看不见的批次。

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

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

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


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

    • 从控制台窗口中已经存在的第二个脚本中, start /b 够了。
    • 从Windows, 而不会触发第二个窗口 ,我的解决方案仍然有效。
    10 回复  |  直到 9 年前
        1
  •  110
  •   Ilyich    9 年前

    以下是一个可能的解决方案:

    从第一个脚本开始,用以下行调用第二个脚本:

    wscript.exe invis.vbs run.bat %*
    

    实际上,您正在调用一个vbs脚本:

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

    然后,invis.vbs将使用以下命令调用您的脚本 Windows Script Host Run() method ,这需要:

    • 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
    
        2
  •  53
  •   P Daddy    17 年前

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

    使用 start /b 第二,巴特 启动第二批文件 与共享第一个窗口的第一个窗口同步。如果两个批处理文件同时写入控制台,输出将重叠,可能无法解读。此外,你会想放一个 exit 命令位于第二批处理文件的末尾,否则您将在一秒钟内 cmd 一旦一切都完成,就去壳。

        3
  •  12
  •   E-rich Richard Schneider    14 年前

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

        4
  •  9
  •   Ilyich    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文件名和路径。

        5
  •  7
  •   npocmaka    5 年前

    对于自我隐藏,您可以使用 getCmdPID.bat windowMode.bat :

    @echo off
    
    echo --- self hiding bat ----
    pause
    call getCmdPid.bat
    set PID=%errorlevel%
    call windowMode.bat -pid %PID% -mode hidden
    

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

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

    示例用法:

    call IEXPhidden.bat "cmd /c myBat.bat"  "argument"
    
    1. SCHTASKS -同样只接受两个参数——命令和参数。还检查它是否以提升的权限启动,如果可能的话,使用WEVTUTIL(可从Vista及更高版本获得,因此较新版本的windows将接收PID)命令获取进程的PID。

    示例用法:

    call SCHPhidden.bat "cmd /c myBat.bat"  "argument"
    
    1. 'WScript.Shell' -该脚本是“WScript”的完整包装。Shell和所有可能的选项都可以通过命令行选项设置。它是jscript/batch的混合体,可以称为bat。

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

    call ShellRunJS.bat "notepad.exe" -style 0 -wait no 
    
    1. 'Win32_ProcessStartup' -同样,完整包装器和所有选项都可以通过命令行参数访问。这一次,它是WSF/batch混合体,包含一些Jscript和一些VBScript代码,但它返回了启动进程的PID。若进程未隐藏,则可以使用X/Y坐标等选项(不适用于每个可执行文件,但例如cmd.exe接受坐标)。

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

    call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"
    
    1. 这个。 NET solution 。ProcessStartInfo选项的大部分选项都被使用了(但最后我太累了,无法包含所有内容):

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

    call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
    
        6
  •  2
  •   wimh    17 年前

    使用“runas”以其他用户名运行它,或者在Windows计划任务中将其安排在其他用户下。

        7
  •  2
  •   JosephStyons    17 年前

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

    启动此操作的批处理文件可以如下(未经测试):

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

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

    你必须 download the Windows 2003 Resource Kit 资源工具包也可以安装在其他版本的windows上,如windows XP。

        8
  •  2
  •   i Mr Oli i    5 年前

    我知道这已经有了答案,但如果有人偶然发现了这一点,这可能会有所帮助:

    这里有一个在后台完全运行它的好方法,而没有任何方法可以看到它。你唯一可以与它交互的方法是使用taskmgr或Process Hacker终止它。

    这使用了一个名为NirCmd的第三方工具。

    1. 制作一个包含以下代码的脚本:
    @echo off
    nircmd exec hide "MainScript.bat"
    
    1. 把它保存为你喜欢的任何东西。“MainScript.bat”可以是任何东西,但请稍后注意。

    2. 现在,用您之前提到的名称制作另一个脚本。对于该示例,我将其命名为MainScript.bat,并为其提供以下代码:

    @echo off
    echo Can you see me now?
    pause 
    exit
    
    1. 这将是您要在后台执行的代码。

    2. 确保它们在同一目录中,并将NirCmd下载到同一目录。

    以下是这些脚本的结果:

    Demo GIF

    NirCmd Download Link

    Demo ZIP File

    注意:NirCmd不是我的工具,但它仍然很有用。

        9
  •  0
  •   avck    12 年前

    您可以通过.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 
    
        10
  •  0
  •   user2928048    7 年前

    您还可以使用

    start /MIN notepad.exe
    

    PS:不幸的是,最小化窗口状态取决于要运行的命令。V.G.不工作

    start /MIN calc.exe