我完全是一个 powershell 新手,所以请多包涵 ;)
我正在尝试编写一个脚本,让一台机器检查外部网站,等待单词“测试”以执行下载。事情是这样的:
$Word = 'test'
$WebClientObject = New-Object Net.WebClient
$comment = "http://MySite.wordpress.com/comment_section/"
$WebClientObject.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36)")
While($True){
$CommentResult = $WebClientObject.DownloadString($comment)
$Found = $CommentResult.contains($Word)
If($Found) {
IEX $WebClientObject.DownloadString('http://A_Server_That_Is_Accessible/Tasks_to_do')
Task_to_do and some blabla commands
Return
}
Start-Sleep -Seconds 60
}
我正在运行 powershell 2.0。Windows7
发生了什么:
- 下载不是通过互联网进行的
- 这不是来自 IP 或路径的问题
我接下来要做的事情:
- 我直接在 powershell 提示符中写下不同的命令:
-->While($True) 启动一个无限循环而不退出。
为了完成这个技巧,我需要“双击键盘上的返回键”,循环结束,然后最终执行“downloadstring”命令。
还记得我还是个新手吗?:(
- 我试过“休息” “返回”或者“出口”但无法退出循环。
- 我也尝试在脚本中输入多次双回车,但都没有成功。
有人可以告诉我如何做这件简单的事情吗......?:)
多谢。
答案1
您的脚本至少存在三个问题:
contains
并不像您想象的那样工作。它告诉您参考值集合是否包含单个测试值。通俗地说,它只对数组元素进行操作并寻找精确匹配。但是您得到的$CommentResult
是一个包含所有页面 HTML 代码的长字符串。因此contains
将 视为具有一个元素的数组,并且由于该元素与字符串“test”不完全匹配,因此它返回False
。- 在您的
if
块中,您不必使用Invoke-Expression
cmdlet(IEX
是它的别名)来调用DownloadString
方法$WebClientObject
。 - 你确实需要做一些 HTML 解析(Html Agility Pack会做),或者至少是一个匹配单词的正则表达式(最好是一个非常唯一字)。因为字符串
test
本身可以作为标签的一部分出现在 HTML 中,例如:<img src='http://server.com/pro测试蚂蚁.jpg' />
我已经修复了你的脚本,使用正则表达式并匹配任何恰好包含字符串的内容test
(包括赞成测试,德测试,拉测试,测试安特等等)在网页的 HTML 代码中。尝试一下,然后根据需要进行修改:
$Word = 'test'
$comment = 'http://MySite.wordpress.com/comment_section/'
$WebClientObject = New-Object -TypeName Net.WebClient
$WebClientObject.Headers.Add('User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36)')
While($true)
{
if($WebClientObject.DownloadString($comment) -match $Word)
{
$Html = $WebClientObject.DownloadString('http://A_Server_That_Is_Accessible/Tasks_to_do')
#Task_to_do and some blabla commands
break
}
Start-Sleep -Seconds 60
}