在Windows上通过定时任务加载URL的推荐方法

65

我有一个托管在Windows主机上的网页,我需要确保它每天至少加载一次。 我目前的计划是创建一个定期任务,打开Internet Explorer并访问该URL:

"C:\Program Files\Internet Explorer\iexplore.exe" myurl.com/script_to_run_daily.aspx

这很容易设置并且可以正常工作,但是我认为这是一种hack方式,因为Internet Explorer实际上需要打开并访问此URL。我不需要从此页面获得任何输入,它只会在被访问时将缓存的数据存储在文件中。

有更好的方法吗?如果有影响的话,这是一个VB.net站点。


虽然使用适当的VB脚本是更好的选择,但您可能需要注意,在任务计划程序的设置选项卡中,如果任务运行时间超过一小时,则可以停止该任务。 - Mike Poole
8个回答

128

正如Remus Rusanu所指出的那样,PowerShell是一个不错的选择。这里有一个简单的一行代码,可以用来创建一个计划任务,而不需要编写单独的.ps1文件:

powershell -ExecutionPolicy Bypass -Command
    Invoke-WebRequest 'http://localhost/cron.aspx' -UseBasicParsing

请注意,这些命令行中添加换行符只是为了清晰明了。在尝试运行这些命令之前,请删除它们。

您可以像这样创建计划任务:(从提升的命令提示符中运行此命令)

schtasks /create /tn "MyAppDailyUpdate"
    /tr "powershell -ExecutionPolicy Bypass -Command
        Invoke-WebRequest 'http://localhost/cron.aspx' -UseBasicParsing"
    /sc DAILY /ru System

以上适用于PowerShell 3+。如果您需要适用于旧版本的内容,以下是一行命令:

powershell -ExecutionPolicy unrestricted -Command
    "(New-Object Net.WebClient).DownloadString(\"http://localhost/cron.aspx\")"

您可以像这样创建计划任务:(从提升的命令提示符)

schtasks /create /tn "MyAppDailyUpdate"
    /tr "powershell -ExecutionPolicy unrestricted -Command
        \"(New-Object Net.WebClient).DownloadString(\\\"http://localhost/cron.aspx\\\")\""
    /sc DAILY /ru System

schtasks 的示例设置了每天运行任务-有关更多选项,请查阅schtasks 文档


你有一个包含查询字符串(以及转义和符号“&”)的示例吗? - Paul George
@PaulGeorge 用 ^& 替换和号应该可以解决问题。 - Nikhil Dabas
5
这对我有用,使用单引号,不改变和符号: powershell -ExecutionPolicy unrestricted -Command "(New-Object Net.WebClient).DownloadString('http://localhost/cron.aspx?var1=cat&var2=dog')" - Paul George
1
有没有办法在这个一行代码中添加一些内容,以包括忽略SSL警告? - Julian
1
感谢您的回答。-UseBasicParsing参数非常有用。它避免了因Internet Explorer增强安全配置阻止网站而出现错误的情况。 - Etienne Coumont
显示剩余2条评论

42

你可以安排一个PowerShell脚本。PS非常强大,可访问整个.NET Framework,而且还有其他功能。以下是一个示例:

$request = [System.Net.WebRequest]::Create("http://www.example.com")
$response = $request.GetResponse()
$response.Close()

18

另一种选择是 VB Script。例如(保存为 file.vbs 文件):

sSrcUrl = "http://yourdomain.com/yourfile.aspx"
sDestFolder = "C:\yourfolder\"
sImageFile = "filename.txt"
set oHTTP = WScript.CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.open "GET", sSrcUrl, False
oHTTP.send ""
set oStream = createobject("adodb.stream")
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
oStream.type = adTypeBinary
oStream.open
oStream.write oHTTP.responseBody
oStream.savetofile sDestFolder & sImageFile, adSaveCreateOverWrite
set oStream = nothing
set oHTTP = nothing
WScript.Echo "Done..."

啊,我应该想到VBScript的。太好了。给你点赞和接受答案。其他人也提出了很好的想法,但是你做了完整解决方案的艰苦工作!非常感谢Rick! - Cory House
我该如何在Ubuntu服务器上完成这个任务?有没有VBScript的替代方案?Java呢? - Senthil Kumar

16

这个 SuperUser.com 的答案 简单得多。

cmd /c start http://example.com/somePage.html

更具体地说,这是在Windows计划任务中的操作:

enter image description here

尽管如此,这可能会在后台运行默认配置的浏览器。如果必须使用IE,则应进行配置。这可能是最佳选择。最好直接作为任务的操作步骤运行解决方案。所有信息都在那里。如果它简洁明了,您甚至可以在不滚动文本框的情况下查看大多数命令。

WGET / CURL - 良好的替代方法

如果必要,WGET可能是cmd..start..url的一个很好的替代品。我不是第一个想到这个问题的人。缺点是您必须下载适用于Windows的WGET才能使其正常工作-它不是开箱即用的解决方案。但是WGET更轻巧,而且重要的是可以给您更多的power。您可以发送许多其他类型的URL调用。这包括不同的HTTP方法,例如POST,自定义头等。Curl是一种很好的选择,而不是Wget-它们具有不同的功能集,许多重叠。

PowerShell - 不推荐

PowerShell可能被认为是一个“更轻巧”的选项,但您也正在加载一个PowerShell(.Net AppDomain),这会有点滞后,并且命令更长,因此如果您经常进行此操作,则更难记住。所以PowerShell不是最佳选择。

VBScript - 不推荐

显然,VBScript不太可取。您需要记住更多内容,并且脚本非常大。除非您有其他需要脚本的步骤,否则不要有一个完全分离的资源来执行可以直接在计划任务中完成的操作。

另请参阅类似问题:


嗨,@Todd,这个解决方案将打开一个浏览器而不是在后台运行。 - MichaelMao
后台操作并不是该操作的要求。虽然使用cmd和这些选项组合起来很容易实现。 - Kind Contributor
我先尝试了Nikhil Dabas和Remus Rusanu提供的PowerShell解决方案,但都没有起作用。这个解决方案非常适合我的需求。 - Francis
我们能否通过单个任务调度程序调用两个网页?基本上,我需要调用3个网页,但我不想为此创建3个不同的调度程序。 - lil-wolf
你可能可以使用 cmd 方法(未经测试)将多个语句组合起来:/c start https://url1.com & start https://url2.com。参见 https://dev59.com/sWsz5IYBdhLWcg3wNU8R - Kind Contributor

12

从PowerShell 5.0开始,curlInvoke-WebRequest的别名,因此您可以按照以下方式创建计划任务:

Action: Start a program
Program/script: powershell
Add arguments: curl http://www.example.com/foo/bar

你也可以使用 Invoke-WebRequest,但是 curl 更加简洁。

一如既往,正确的答案总是最后一个。使用cmd /c将打开一个浏览器窗口,这可能不是你想要的。 - Hypersapien

5

最常见的命令行http请求工具,如cURLwget,都有Windows版本。你可以创建一个定时任务来运行其中之一。如果需要动态生成URL参数等操作,则可以在Windows脚本宿主脚本中执行此操作。


很多好的选项,我特别喜欢Windows脚本宿主的想法,但由于Rick提供了完整的解决方案,所以我选择了他的解决方案。谢谢你们未来的建议! - Cory House

1
如果在运行PowerShell脚本时出现“底层连接被关闭:发送时发生意外错误”的消息,请在您的脚本顶部添加以下代码行:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

随着对TLS 1.0、1.1等的弃用和对TLS 1.2的最新支持,您的PowerShell脚本需要进行必要的更改。


1

我在PowerShell 4.0上尝试使用curl,curl是Invoke-WebRequest的别名,因此您可以按照以下方式创建计划任务:

操作:启动程序 程序/脚本:powershell 添加参数:curl http://www.example.com/foo/bar

非常顺利地完成了!


欢迎来到Stack Overflow!虽然链接是分享知识的好方法,但如果它们在未来失效了,它们就无法真正回答问题。将回答中回答问题的链接的基本内容添加到您的回答中。如果内容太复杂或太大而无法适合此处,请描述所提出解决方案的一般思路。请记得始终保留对原始解决方案网站的链接参考。请参见:如何编写良好的答案?(https://stackoverflow.com/help/how-to-answer) - sɐunıɔןɐqɐp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接