因此,我将一个批处理文件放在一起,在启动时运行,执行少量进程,其中一个是在进程集结束时执行某个程序的重启。我一直在寻找如何在Windows命令行中执行此操作,但我需要能够在不打开浏览器的情况下执行此操作。我需要的是在不打开浏览器的情况下在以下URL中执行重启。
http://192.168.1.100/cgi-bin/reboot
我尝试过的所有内容都打开了一个新的浏览器窗口。如果可能的话,我不想下载任何内容以便在Windows中进行此操作。感谢您的任何建议。
答案 0 :(得分:3)
您知道有时问题的答案是not necessarily the answer you need吗?我有一种模糊的怀疑,这可能是其中一次。
如果这是您尝试重新启动的Windows计算机,则可以远程重新启动它,而无需使用远程主机提供的CGI脚本。如果您在触发PC上登录的帐户也具有远程PC的权限,则可以使用shutdown
命令触发重新启动。
shutdown /m \\remotePC /r /t 0
在cmd控制台中执行shutdown /?
以获取更多信息。或者,如果您必须进行身份验证,则可以使用wmic
代替。
wmic /node:remotePC /user:remotePCadmin /password:remotePCpass process call create "shutdown -r -t 0"
如果我弄错了,这就是你问的问题的答案。执行远程CGI脚本的最快方法是使用带有Windows脚本宿主(VBScript或JScript)的XMLHTTPRequest。这是一个例子。
@if (@CodeSection == @Batch) @then
@echo off & setlocal
set "URL=http://192.168.1.100/cgi-bin/reboot"
cscript /nologo /e:jscript "%~f0" "%URL%"
goto :EOF
@end // end batch / begin JScript chimera
var x = WSH.CreateObject("Microsoft.XMLHTTP");
x.open("GET",WSH.Arguments(0),true);
x.setRequestHeader('User-Agent','XMLHTTP/1.0');
x.send('');
while (x.readyState != 4) WSH.Sleep(50);
对于它的价值,您还可以根据需要解析x.responseText
。您可以将其作为平面文本进行删除,甚至将其评估为分层DOM对象。 This answer demonstrates这样的解析。如果你还不够,here are more examples。
如果您希望以牺牲效率为代价来简化某些事情,则可以调用PowerShell命令。
@echo off & setlocal
set "URL=http://192.168.1.100/cgi-bin/reboot"
powershell "ipmo BitsTransfer; Start-BitsTransfer \"%URL%\" \"%temp%\a\""
del /q "%temp%\a"
goto :EOF
您可以使用Invoke-WebRequest
来避免临时文件,但Invoke-WebRequest
需要PowerShell版本3或更高版本。 Start-BitsTransfer
适用于PowerShell版本2,因此它应该适用于更多计算机。也可以使用[System.Net]::WebRequest
.NET类,但是构建除了获取HTTP标头以使Web服务器为Web页面服务之外所需的所有对象都会变得有点复杂。如果你很好奇,它看起来像这样:
powershell "[void](new-object IO.StreamReader([Net.WebRequest]::Create(\"%URL%\").GetResponse().GetResponseStream())).ReadToEnd()"
不完全是我所说的简单。采用混合格式,便于阅读:
<# : batch portion
@echo off & setlocal
set "URL=http://192.168.1.100/cgi-bin/reboot"
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF
: end batch / begin PowerShell hybrid chimera #>
$request = [Net.WebRequest]::Create($env:URL)
$response = $request.GetResponse()
$stream = $response.GetResponseStream()
$reader = new-object IO.StreamReader($stream)
[void]$reader.ReadToEnd()
在任何情况下,任何PowerShell解决方案都会比本答案顶部附近的JScript解决方案慢一两秒。 powershell.exe
需要一两秒才能加载(如果自上次重启Windows以来未加载,则需要几秒钟);而cscript.exe
几乎立即开火。
答案 1 :(得分:1)
如果您无法下载任何内容,则Windows PowerShell是最佳选择。您可以从PS脚本文件中调用它,也可以直接从批处理文件中的命令行调用它:
powershell.exe -noprofile -command "Invoke-WebRequest -Uri http://192.168.1.100/cgi-bin/reboot"
您还可以考虑Curl此类流程。 Windows中没有等效内容,因此需要下载。
curl http://192.168.1.100/cgi-bin/reboot
Curl不会打开浏览器窗口,并且具有很棒的命令行选项(请参阅curl -help
),并将返回错误代码以进行批处理文件错误处理。
答案 2 :(得分:1)
我不认为Windows会附带该功能。
尝试制作一个可以打开浏览器Windows的VBscript,但不会显示任何内容。
答案 3 :(得分:0)
要直接从Win CMD处理URL响应,
powershell "Invoke-WebRequest -Uri <url>"
要保存服务器对文件的响应:
powershell "Invoke-WebRequest -Uri <url> -outfile <file.ext>"
.NET解决方案;来自Win CMD:
powershell "[System.Net.Webclient]::new().DownloadString(\"<URL>\")"