我正在嘗試創建一個PS登錄腳本,它將偵聽串行端口,將數據傳遞到其原始應用程序,解析數據並使用結果打開內部服務器並顯示信息與數據相關的頁面。Powershell預定作業; Internet Explorer不可見
我已經從一個活動的PowerShell會話中得到它的工作,但是當我將它作爲計劃任務運行時,我看不到它調用的IE。我知道它實際上是加載並執行登錄和查找,因爲我可以看到在我們的內部網頁上創建了一個新的用戶會話,並且每次給串行端口提供新的條形碼掃描時,我都可以看到它將它傳遞給最初的目標應用。
我看到TechNet上的一些討論似乎表明,以這種方式使用IE是不可能的,但是它如何管理登錄到網站?
# Variables
$username = ""
$password = ""
$meterno = ""
$rawmeterno = ""
$ReceivePort = "COM6"
$SendPort = "COM7"
Function Initialize() {
$global:RCport = $null
$global:SNport = $null
$global:RCport = new-object system.io.ports.serialport $ReceivePort,9600,none,8,one
$global:RCport | add-member -membertype "NoteProperty" -name "identifier" -value "ReceiveSerial"
$global:RCport.open()
#$global:RCport
$global:SNport = new-object system.io.ports.serialport $SendPort,9600,none,8,one
$global:SNport | add-member -membertype "NoteProperty" -name "identifier" -value "SendSerial"
$global:SNport.open()
#$global:SNport
}
Function ParseMeter($rawmtr){
$meter = $rawmtr |
%{
if ($_ | sls -pattern "SD") {
([regex]"[0-9]{5}SleepDrinks").matches($_) | % {$_.value}}
elseif ($_ | sls -pattern "TD/TR") {
$TD = ([regex]"[T]Drinks[/][T][R][0-9]{3}").matches($_) | %{$_.value}
$TD = ($TD -replace "/TR", "")
$TD}
else {$_ | % { $_.tostring().split()[1] }}
}
write-host "ParseMeter result: $meter `n"
$meter
}
Function Main {
Do{
$rawmeterno = $global:RCport.readline()
write-host $rawmeterno
$meterno = $rawmeterno | %{ParseMeter($_)}
$global:SNport.writeline("$rawmeterno")
#check for ie
$ie
if (!($ie)) {
$ie = New-Object -com InternetExplorer.Application
$ie.visible=$true
sleep -s 2}#if
$ie.navigate2("http://server/endpointlookup.aspx")
sleep -s 2
$ie.locationname
$ie
#login
if ($ie.locationname -eq "http://server/login.aspx?ReturnUrl=%2fcc%2fendpointlookup.aspx") {
sleep -s 2
write-host "Login Function"
$ie.visible = $true
$ie.navigate2("http://server/login.aspx")
while($ie.busy) {start-sleep -s 2}
$ie.document.getElementById("LoginName").value= $username
sleep -s 1
$ie.document.getElementById("Password").value = $password
sleep -s 1
$ie.document.getElementById("LoginBtn").click()
sleep -s 3
while($ie.busy) {start-sleep -s 2}
#lookup
$ie.navigate2("http://server/endpointLookup.aspx")
while($ie.ReadyState -ne 4) {start-sleep -s 1}
sleep -s 1
$meterno
$ie.document.getElementById("ctl00_PageBody_MeterNumberBox").value = $meterno
write-host "meterno assigned"
sleep -s 2
$ie.document.getElementById("ctl00_PageBody_RetrieveButton").click()
write-host "button clicked"
sleep -s 2
write-host "about to assign 'details' to variable"
$details = @($ie.document.getelementsbytagname('a')) | where-object {$_.innerText -eq 'Details'}
$details
write-host "variable assigned, about to click"
$details.click()
write-host "details clicked"
Trap{"$_" ; $global:SNport.close(); $global:SNport.dispose(); $global:RCport.close(); $global:RCport.dispose(); $ie.quit() ;sleep -s 2; Break }
}#if
#lookup
else {
$ie.navigate2("http://server/endpointLookup.aspx")
while($ie.ReadyState -ne 4) {start-sleep -s 1}
write-host "Lookup Function"
$ie.visible = $true
$ie.document.getElementById("ctl00_PageBody_MeterNumberBox").value = $meterno
write-host "Meterno assigned"
sleep -s 1
$ie.document.getElementById("ctl00_PageBody_RetrieveButton").click()
write-host "clicked GO"
sleep -s 1
$elsedetails = @($ie.document.getelementsbytagname('a')) | where-object {$_.innerText -eq 'Details'}
write-host "variable assigned, about to click"
$elsedetails.click()
write-host "details clicked"
Trap{"$_" ; $global:SNport.close(); $global:SNport.dispose(); $global:RCport.close(); $global:RCport.dispose(); $ie.quit() ;sleep -s 2; Break }
}#else
}#do
while ($global:RCport.isopen -eq $true)
}#function - Main
Initialize
sleep -s 2
Main
計劃任務設置爲在登錄時運行,升高。我正在使用IE10和PS 4.0在Win7(64)上測試它。
正如您在腳本中看到的那樣,我將IE設置爲在幾個地方可見。有任何想法嗎?
感謝您的任何反饋!
當你登錄時你能看到後臺運行IExplore.exe嗎?它在哪個帳戶下運行? – TheMadTechnician 2014-09-03 18:14:05
它在我的用戶帳戶下運行。 – JayCee 2014-09-03 18:52:59