所以我想使用powershell自动执行这个简单的操作:
注意:任何解决方案都非常适合我
我想使用 Invoke-WebRequest ,因为它没有启动正常的IE会话。非常感谢!
此代码:
$ie = $null
$ie = new-object -com internetexplorer.application
$ie.navigate('http://example.com/')
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "myname"
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click()
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click()
sleep 2
$personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<" ) -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0)
$ie.quit()
工作,但只有当我打开一个PowerShell并从那里启动命令时。如果我将其保存为脚本并启动它,它就不起作用。
PS:降低IE安全性是不可行的,无论如何它并没有解决问题。
PPS:上面的版本是我使用的代码的简化版本,没有超出主题的内容。完整版本正在等待浏览器,但它仍然没有工作(可能是由于cookie问题?如果有人可以建议如何做,我很乐意解决。我已经有关于cookies,我用Chrome Dev Tools重新发布了帖子。我只是不知道如何在我的脚本中使用这些信息。)
PPPS:如果问题与交互模式相关联,我是否可以在模拟交互式会话的另一个PowerShell中执行所有这些命令?那会有用。谁知道怎么做?
这是另一种尝试。没有错误,但它返回页面的内容。我甚至不确定请求是否已经完成。
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$cookie = New-Object System.Net.Cookie
$cookie.Name = "mycookiename"
$cookie.Value = "mycookievalue"
$cookie.Path = "/"
$cookie.Domain = "example.com"
$session.Cookies.Add($cookie)
$uri = "http://example.com"
$body = @{username="myname";fields="PERSONNEL_NBR"}
#THESE ARE UNSUCCESSFUL ATTEMPTS
#$r = Invoke-WebRequest -Uri $uri -WebSession $session
#$r.InputFields[34].innerHTML = "true"
#$r.InputFields[34].innerText = "true"
#$r.Forms[0].Fields["fields"] = "PERSONNEL_NBR"
#$r.Forms[0].Fields["PERSONNEL_NBR"] = "true"
#$r.InputFields[0].innerText="myname"
#$r.Forms[0].Fields["username"] = "myname"
#$r = Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $r
$r = Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $body
$r.RawContent
答案 0 :(得分:0)
使用IE comm对象有一些令人烦恼的事情,但它们大部分都可以使用,例如使用.visible = $false
将隐藏IE窗口。
检查.Busy
以查看页面实际加载的时间。您可能会发现脚本未执行的原因,因为它是一个独立的脚本,它正在快速运行。
$ie = New-Object -com internetexplorer.application;
$ie.visible = $false;
$ie.navigate('http://mypioneer.phibred.com/ews/');
while ($ie.Busy -eq $true)
{
Start-Sleep -Seconds 2;
}
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "medada"
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click()
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click()
while ($ie.Busy -eq $true)
{
Start-Sleep -Seconds 2;
}
$personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<" ) -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0)
Write-Host $personnel_nbr
$ie.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie)
Remove-Variable ie
另一种方法是尝试捕获表单提交POST数据,并使用列出的here
工具之一重新创建POST传输答案 1 :(得分:0)
如果您需要在POST请求中使用cookie,则需要创建Cookie对象,将其添加到WebRequestSession对象,并将其用作invoke-webrequest的WebSession参数:
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$cookie = New-Object System.Net.Cookie
$cookie.Name = "cookieName"
$cookie.Value = "cookieValue"
$cookie.Domain = "cookieDomain"
$session.Cookies.Add($cookie)
Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $body
$body
变量是发布请求的内容,因此您需要使用收集的有关发布请求的信息来创建它。它看起来像这样:
$body = @{
username = "medada"
input name = value
...
}
答案 2 :(得分:0)
好的,所以..阻止脚本工作的问题既不是交互模式也不是cookie。问题出在管理员权利上。
所以这段代码完美无缺:
$ie = $null
$ie = new-object -com internetexplorer.application
$ie.navigate('http://example.com')
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "myname"
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click()
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click()
while ($ie.Busy -eq $true -and $timer -lt 10) {
sleep 1
$timer++
echo "Waiting for example.com..."
}
if ($timer -gt 10) {
while ($confirmation -ne "y" -and $confirmation -ne "n") {
$confirmation = Read-Host "`nConnection timed out. Do you want to try to grab it manually? (y/n)"
if ($confirmation -eq 'y') {
echo "`nPlease go to this page:`nhttp://example.com and put `"$username`" in the `"USERNAME`" field, then check the `"PERSONNEL_NBR`" checkbox and then submit."
Read-Host "`nPERSONNEL_NBR"
}
elseif ($confirmation -eq 'y') {
echo "`nRemember to add the PERSONNEL_NBR later!"
}
else {
echo "`nInvalid option."
}
}
$confirmation=$null
}
$personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<" ) -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0)
echo "The PERSONNEL_NBR is $personnel_nbr"
$ie.quit()
您只需将其作为管理员运行即可。感谢大家,感谢您的帮助和时间。