2014-09-03 86 views
0

我正在嘗試創建一個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設置爲在幾個地方可見。有任何想法嗎?

感謝您的任何反饋!

+0

當你登錄時你能看到後臺運行IExplore.exe嗎?它在哪個帳戶下運行? – TheMadTechnician 2014-09-03 18:14:05

+0

它在我的用戶帳戶下運行。 – JayCee 2014-09-03 18:52:59

回答

0

您將看不到計劃任務的任何Internet Explorer窗口。即使它以您的身份運行,但它並未在您的會話中運行,而是在計劃任務的會話中運行。

更新您的代碼以將它正在做的事情記錄到文件,事件日誌或其他數據接收器中,以便您瞭解它正在執行的操作。

+0

或者只是在開始菜單的Startup文件夾中創建一個運行腳本的快捷方式。 – TheMadTechnician 2014-09-03 20:29:17

+0

奇數。爲了添加日誌記錄到腳本(以下這篇文章:http://stackoverflow.com/questions/13784382/how-to-redirect-powershell-output-when-run-from-task-scheduler)我不得不手動創建任務調度程序中的任務。前一個是使用powershell內的register-scheduledjob構建的。現在它似乎工作正常;我可以看到IE沒有問題。 – JayCee 2014-09-03 20:53:12

+0

似乎在任務計劃程序中創建計劃任務可以看到Internet Explorer對象,並且register-scheduledjob可以阻止它。不知道爲什麼,但這解決了問題,所以我會將其標記爲已回答。謝謝Aaron! – JayCee 2014-09-03 21:14:19

相關問題