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


我有一个计划任务,启动运行的批处理脚本 robocopy 每隔一小时。每次运行时都会在桌面上弹出一个带有robocopy输出的窗口,我真的不想看到它。

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

cmd /c start /min mybat.bat

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

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


139
2018-05-17 09:00




我发现这个更好的答案 stackoverflow.com/questions/6568736/... - Efekt


答案:


您可以使用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表示“隐藏窗口”。

完整的语法 运行方法

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

参数:

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

142
2018-05-17 09:08



+1,只是写了完全相同的东西 - Sam Cogan
你在删除它之前就看到了它。我想我们都是机器人。 ;-) - splattne
用户名,老实说,我认为Sam比我更应该得到它。但是谢谢你!并且不要在同一句话中提及我和Jon Skeet。这是亵渎神明! ;-) - splattne
对于“有没有办法在没有弹出cmd窗口的情况下运行批处理脚本?”的问题,它给出了一个非常直接的答案:使用Windows脚本文件运行它。 - Mark Meuer
@Lee我想如果您的路径包含空格,则需要双引号。 - splattne


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

(如果您使用的是robocopy,则可能需要使用真实用户...)

JR


55
2018-05-17 09:13



谢谢 - 这对我来说比.vbs选项更麻烦。 - mackenir
我将“运行方式”用户设置为SYSTEM(后来更改为NT AUTHORITY \ SYSTEM),它对我有用。我的计划任务运行时,我不再看到弹出式CMD窗口。谢谢! - Ryan Stille
+1,这很优雅。一定要输入“system”作为用户名,然后win7为你完成剩下的工作。请注意,您要获得对互联网的网络访问权限,而不是网络共享和需要Windows身份验证的东西。 - samsmith
系统用户简洁大方,非常棒! +1! - Matteo Conta
看到 实施最低权限管理模型。是否使用系统帐户违反了最低权限政策?如果是这样,那么管理员应该知道 不 在大多数情况下这样做。 - user34660


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


27
2017-10-04 20:06



完善!您甚至可以禁用凭据存储,然后这比使用SYSTEM运行更安全! - binki


你也可以试试 CHP(创建隐藏流程),完全按照你的想法......

CHP.EXE mybat.bat

没有命令窗口运行。完善!由与CMDOW相同的人制作,但这更合适。


17
2017-07-20 21:54



当您需要在登录用户的上下文中运行任务时,可以正常工作(“触发器:连接到用户会话”,“将任务运行为:用户”) - Sergei
这不是内置工具 - Jonny Leeds


CMDOW 是一个很棒的工具,它允许你从命令行向windows做很多很多事情。

最简单的事情之一是隐藏当前窗口(通常作为bat文件中的第一行):

cmdow @ /hid

或启动一个新的隐藏进程

cmdow /run /hid mybat.bat 

9
2018-05-17 11:30



这个和Rocketmonkeys建议都涉及下载新工具,这意味着更多兼容各种桌面。烘焙中,使用Windows命令要好得多。 - IanVaughan
加上cmdow被一些反病毒程序检测为“危险”(确实如此) 不 危险,但如果cmdow文件被隔离,检测本身可能会导致一些问题...)。 - Otiel
还有弹出控制台,只是闪光很快。 - Bamboo


尝试使用调用脚本

start /b <command>

5
2018-05-17 14:54



这不起作用,Scheduled Task-> Status声明“无法启动”,那就是:start / b C:\ file.bat:和:start / b“C:\ file.bat”:但是:C:\ file.bat:工作正常。 - IanVaughan
因为 start 不是程序,它是一个命令。你需要指定 cmd 作为运行的程序和 /c start /b <file> 作为论点。但是,这仍然不起作用,因为它仍然会为其创建一个控制台窗口 cmd 并在屏幕上闪烁一个黑色的窗口。 - Synetech
也可以通过@Synetech确认这不会创建一个新窗口,但是你仍然需要打开一个控制台窗口才能启动它。这确实是一个方便的命令,但不能按计划任务的要求使用。 - JonathanDavidArndt


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

重要:您需要通过在“运行”文本字段中键入快捷方式来指定快捷方式的路径,并使用“.lnk”扩展名;如果您只是尝试浏览它,它会 有益 将自身重定向到快捷方式指向的任何位置。


5
2017-08-11 16:49



这在Windows 10 x64上不起作用,这会弹出“你想如何打开这个文件?” - Jan


我意识到这个问题已经得到了一个非常好的解决方案的答案,这是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]

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

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

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


1
2018-05-01 03:38