4

这是我的情况:

  • 我有一个 BAT 文件需要很长时间才能运行(1 分钟到 70 分钟)
  • 我用 Windows 调度程序安排它每 10 分钟运行一次
  • 如果它仍在运行时再次调度,则不会发生任何事情(这很好)

我的问题是我需要我的 BAT 静默运行,但它不需要。因此,我想使用如下的 Windows 脚本启动它:

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:\Batch Files\syncfiles.bat" & Chr(34), 0
Set WshShell = Nothing

不幸的是,当我安排这个脚本时,它完成了工作但立即返回,使 Windows 调度程序认为任务已经完成,而实际上 BAT 只是在某个地方自行运行。

因此,Windows 将在 10 分钟后再次重新安排作业并进行多次运行。

我需要的:

有没有办法告诉 Windows 脚本文件在继续/退出之前等待 .Run 命令的目标完成?基本上,我希望它的行为就像我启动了另一个线程,然后在其上调用了 join,所以它执行与 BAT 相同的操作,但不显示控制台窗口。

其他解决方案

告诉我任何其他方法可以让这个 BAT 静默执行(powershell 命令等),我也会接受它作为解决方案。只是不要告诉我围绕它写一个完整的 C++/C# 应用程序,那是矫枉过正 :)


运行: Windows Server 2008 R2

4

2 回答 2

6

我认为对于可选的第三个参数,您只需要 TRUE

WshShell.Run chr(34) & "C:\Batch Files\syncfiles.bat" & Chr(34), 0, TRUE
于 2012-07-25T22:58:31.643 回答
4

疯狂的地方来了……

创建一个文件invisible.vbs

CreateObject("Wscript.Shell").Run """" & WScript.Arguments(0) & """", 0, True

然后在任务调度程序中,像这样调用你的脚本:

wscript.exe "C:\Batch Files\invisible.vbs" "C:\Batch Files\syncfiles.bat"

我对其进行了测试,这确实有效:没有命令窗口,并且该任务被认为正在运行,直到批处理脚本结束。

归功于https://superuser.com/a/62646/40362


For 2008 R2 make invisible.vbs 有这个内容,直接执行即可。它将静默运行 BAT 并等待完成。

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "D:\IUpdateScript.bat", 0, true
于 2012-07-25T23:20:29.293 回答