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

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

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

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

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

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


谢谢你们的回答。根据我的理解,如果需要异步调用脚本以不可见模式运行:

  • 从已经在控制台窗口中的第二个脚本来看,start /b就足够了。
  • 从 Windows,而不会触发第二个窗口,我的解决方案仍然有效。
130824 次浏览

这里有一个可能的解决办法:

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

wscript.exe invis.vbs run.bat %*

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

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

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

  • IntWindowStyle: 0表示“不可见的窗口”
  • BWaitOnReturn: false 表示第一个脚本不需要等待第二个脚本完成

下面是 inve.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

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

您的 可以使用 start /b 第二,蝙蝠从您的第一个同步启动第二个批处理文件 ,共享您的第一个窗口。如果两个批处理文件同时写入控制台,则输出将是重叠的,并且可能无法破译。另外,您可能希望在第二个批处理文件的末尾放置一个 exit命令,或者在完成所有操作之后,您将处于第二个 cmd shell 中。

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

启动该文件的批处理文件如下所示(未经测试) :

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

注意,以这种方式启动的批处理文件作为系统用户运行,这意味着您不能自动访问网络共享。但是您可以使用 净用途连接到远程服务器。

你必须得到 下载 Windows2003资源工具包。资源工具包也可以安装在其他版本的窗口上,如 WindowsXP。

将批处理文件转换为 exe。尝试 Bat 到 Exe 转换器在线 Bat 到 Exe 转换器,并选择作为幽灵应用程序运行的选项,即没有窗口。

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

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

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

对于自我隐藏,你可以使用 GetCmdPID.batWindowMode.bat:

@echo off


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

下面是我收集的实现这一目标的方法——甚至更多——我曾经尝试返回已启动进程的 PID (所有链接的脚本都可以下载并保存,只要你觉得方便的名称) :

  1. 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳解决方案甚至可以用于老赢95/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’和每个可能的选项都可以通过命令行选项来设置。

使用示例(更多信息,请使用’-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 解决方案 .ProcessStartInfo 选项的大部分选项都被使用(但最后我实在是太累了,没法把所有选项都包括进去) :

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

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

你也可以用

start /MIN notepad.exe

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

start /MIN calc.exe

我知道这已经有了答案,但如果有人无意中发现了这个,这可能会有所帮助:

这里有一个很好的方法来运行它完全在后台,没有任何办法看到它。与它交互的唯一方法是使用 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 下载链接

演示 ZIP 文件

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