在没有窗口的计划任务中运行.bat文件


143

我有一个计划的任务,该任务启动一个robocopy每小时运行一次的批处理脚本。每次运行时,都会在桌面上弹出一个窗口,其中包含robocopy的输出,我并不是很想看到。

我设法通过运行计划的作业来使窗口最小化

cmd /c start /min mybat.bat

但这给了我每小时一个新的命令窗口。鉴于cmd /c“执行由字符串指定的命令然后终止” ,我对此感到惊讶-我一定对文档有误解。

有没有办法在不弹出cmd窗口的情况下运行批处理脚本?


我发现这是一个更理想的答案stackoverflow.com/questions/6568736/...
Efekt

Answers:


144

您可以改为使用Windows脚本文件来静默运行它。运行方法允许您以不可见模式运行脚本。创建一个.vbs像这样的文件

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

并安排时间。本示例中的第二个参数设置窗口样式。0表示“隐藏窗口”。

Run方法的完整语法:

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

参数:

  • 对象:WshShell对象。
  • strCommand:字符串值,指示要运行的命令行。您必须包括要传递给可执行文件的所有参数。
  • intWindowStyle:可选。指示程序窗口外观的整数值。请注意,并非所有程序都使用此信息。
  • bWaitOnReturn:可选。布尔值,指示脚本在继续执行脚本中的下一条语句之前是否应等待程序完成执行。如果设置为true,则脚本执行将暂停,直到程序完成为止,然后Run将返回程序返回的所有错误代码。如果设置为false(默认值),则Run方法在启动程序后立即返回,并自动返回0(不会被解释为错误代码)。

+1,只是写了完全一样的东西
山姆·科根

在您删除它之前,我已经看到了。我想我们都是机器人。;-)
splattne

1
用户名,老实说,我认为Sam应该得到的比我更多。但是还是谢谢你!而且不要在同一句话中提及我和Jon Skeet。真是亵渎!;-)
splattne

3
对于“是否有一种方法可以运行批处理脚本而不会弹出cmd窗口?”这个问题,它给出了一个非常直接的答案:使用Windows脚本文件运行它。
Mark Meuer 2012年

2
@Lee我猜如果您的路径包含空格,则必须使用双引号。
splattne

58

您是否将此作为计划任务运行?如果这样,则将其设置为以其他用户帐户运行,那么登录的用户将看不到它。如果脚本不需要网络访问需要Windows身份验证的项目(例如文件共享或打印机),则可以将其作为“ nt Authority \ system”运行,并将密码保留为空。在Windows 7上,只需将用户设置为SYSTEM,然后按OK。

(如果您正在使用robocopy,则可能必须使用真实用户。)

JR


3
谢谢-与.vbs选项相比,这对我来说没有那么麻烦。
Mackenir 2010年

8
我将“运行方式”用户设置为SYSTEM(后来更改为NT AUTHORITY \ SYSTEM),它对我有用。我的计划任务运行时,我不再看到弹出的CMD窗口。谢谢!
瑞安·斯蒂尔

1
+1,这很优雅。确保输入“ system”作为用户名,然后win7为您完成其余工作。请注意,您确实可以通过网络访问Internet,只是不能访问网络共享和需要Windows身份验证的内容。
samsmith'3

1
系统用户简洁大方,提示很棒!+1!
Matteo Conta,2012年

1
请参阅实施最小特权管理模型。为此使用系统帐户是否违反最小特权策略?如果是这样,那么管理员应该知道在大多数情况下要这样做。
user34660 '18

29

只需将计划任务配置为“无论用户是否登录都运行”。


6
完善!您甚至可以禁用凭据存储,然后这比让SYSTEM运行它更安全!
2015年

17

您还可以尝试CHP(创建隐藏进程),完全按照您的想法进行...

CHP.EXE mybat.bat

在没有命令窗口的情况下运行。完善!与CMDOW由同一个人制作,但这更合适。


当您需要在已登录用户的上下文中运行任务时完美工作(“触发器:在连接到用户会话时”,“以以下身份运行任务:用户”)
Sergei

1
这不是内置工具
JonnyRaa

9

CMDOW是一个了不起的工具,它使您可以从命令行对Windows执行许多操作。

最简单的操作之一是使用以下命令隐藏当前窗口(通常作为bat文件的第一行):

cmdow @ /hid

或开始一个新的隐藏过程

cmdow /run /hid mybat.bat 

4
这和Rocketmonkeys的建议都涉及下载新工具,这意味着在各种人的桌面上具有更大的兼容性。使用Windows命令进行烘焙会更好。
IanVaughan 2011年

Plus cmdow被某些防病毒程序检测为“危险”(这不是危险的,但是如果cmdow文件被隔离,则检测本身可能会引起一些问题...)。
Otiel 2012年

3
仍然有弹出式控制台,只是快速闪烁。
Bamboo

5

尝试使用调用脚本

start /b <command>

1
这不起作用,“计划任务”->“状态”状态为“无法启动”,即:开始/ b C:\ file.bat:和:开始/ b“ C:\ file.bat”:但是:C:\ file.bat:工作正常。
IanVaughan 2011年

1
因为start不是程序,所以是命令。您需要指定cmd作为要运行的程序和/c start /b <file>参数。但是,这仍然行不通,因为它仍将为它创建一个控制台窗口cmd并在屏幕上闪烁一个黑色窗口。
Synetech

1
也可以使用@Synetech确认这将不会创建新窗口,但是您仍然需要打开控制台窗口才能启动它。这确实是一个方便的命令,但不能按计划任务的要求使用。
乔纳森·

5

您可以创建批处理文件的快捷方式,将快捷方式设置为最小化开始(在快捷方式的属性中,“快捷方式”选项卡),然后将作业设置为启动快捷方式。

重要提示:您需要通过在“运行”文本字段中键入快捷方式的路径来手动指定快捷方式的路径,并以'.lnk'扩展名完成;如果你只是试图浏览它,它会帮忙,自己重定向到任何快捷方式指向。


这在Windows 10 x64上不起作用,弹出窗口“您如何打开此文件?”
1

1

我意识到这个问题已经以Windows固有的完美分辨率解决了,因此应该是最兼容的,我完全同意。

我还想说我不同意@splattne的评论(但不是他的实际答案)-另一个引用线程中的分辨率值得赞扬。该答案涉及以其他用户身份(SYSTEM)运行脚本,这几乎等同于授予脚本root用户访问权限。对于诸如ROBOCOPY需要进行网络访问的工作(如John Rennie所引用),它也将失败。

我以前从未尝试CMDOW过,但是我想提供另一个类似的解决方案,尽管该解决方案虽然不是Windows上的本地安装,但仍可移植到大多数版本,并且有32位和64位版本,这就是NirCmd

NirCmd是一个非常强大的工具,具有许多选项,其中最有用的是我个人认为的功能,它只需执行以下命令即可启动隐藏的命令窗口:

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

exec部分中的NirCmd命令参考

exec [show/hide/min/max] [application + command-line]

运行一个应用程序,并为执行的应用程序指定一个或多个命令行参数。[show / hide / min / max]参数指定正在运行的应用程序是否可见。如果指定了“隐藏”,则用户将看不到正在运行的应用程序。如果指定“ max”,则正在运行的应用程序窗口将最大化。如果指定“ min”,则正在运行的应用程序窗口将最小化。

编辑: 我正在尝试运行ROBOCOPY作业,并尝试了此答案中的方法,即使编辑了网络访问权限后,它也无法正常工作。我尝试双击该脚本,无法使其正常运行,但只能使其在提升的命令提示符下运行。我确实创建了一个批处理文件的快捷方式,并使其以管理员身份运行,并且能够通过双击该文件来执行它,但是最终使用的方法是将其隐藏为SYSTEM(我知道,我知道) -但ROBOCOPY只要批处理文件具有正确的权限,它就可以与配合使用,以实现其价值。

编辑2: 由于某种原因,它不能作为系统工作(可能是前面提到的网络访问)-我只是在实际运行后ROBOCOPY没有/ L标志的情况下才注意到这一点,这基本上只是一个模拟,[显然]并没有实际连接到远程系统,但是当我以最高特权运行批处理文件并选中隐藏框时,我仍然可以在后台以登录用户身份运行它,而不会显示命令窗口,无论任何人都值得这样做。




-2

要隐藏输出(尽管不是窗口),请将其添加到批处理文件的开头:

@echo off
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.