<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我之前看到過一個類似的帖子...
我的批處理文件看起來一樣,
像這樣:
“C:\ Program Files \ SAS \ JMP \ 9 \ jmp.exe”“C:\ SCHEDULED \ MYSCRIPT.jsl”
但我已經有 exit(nosave);在我的腳本末尾(並關閉了所有表格和窗口)。而且,如果我只需單擊 .bat 文件即可運行它,它會打開 JMP,運行腳本,然後按預期退出。只有當我通過任務計劃程序運行這個 .bat 文件時,才會出現問題。它似乎沒有執行 exit()。該腳本確實運行並執行其操作,但jmp.exe 保持打開狀態- 我可以在任務管理器中看到它,儘管它在其他情況下不可見,並且任務不會繼續進行(調度程序不會說它已完成,它會等待直到設定的最大時間並終止任務)。因此,效果是我的自動化腳本正在完成其工作,但隨著時間的推移,越來越多的JMP 打開,直到出現內存錯誤(如果我查看調度程序歷史記錄,我的作業永遠不會成功完成,它們都會在一小時後終止,或者任何)。我嘗試在 bat 文件中使用 tskill 來關閉 JMP,但這沒有幫助,大概是因為它永遠不會到達該步驟。
我還發現可以通過將批處理文件修改為以下內容來使調度程序滿意:
啟動“”“C:\Program Files\SAS\JMP\9\jmp.exe”“C:\SCHEDULED\MYSCRIPT.jsl”。然後它不會徒勞地等待事情結束,調度程序認為它在啟動 .bat 文件後就完成了,但我仍然有 JMP 進程保持打開狀態。當我在調度程序中打開JMP時,我仍然不知道如何成功關閉JMP。也許我可以每天運行一個任務,在某個奇怪的時間(當我不希望運行任何有用的東西時)對所有打開的 JMP 執行任務終止。但我希望有一個更清潔的解決方案。
對此有何想法?
這是JMP9和Windows7。各種不同的 JSL 腳本都會發生這種情況,所有這些腳本似乎都完成了其任務,直到退出 JMP(並且確實在調度程序之外退出 JMP)。
我觀察到了與所描述的相同的問題。 但我找到了一個非常簡單的解決方案。
我注意到,當我以交互方式運行JMP 時,當我關閉它時,如果有任何打開的文件(例如腳本),我總是會出現一個“保存會話”對話框,詢問我“您希望JMP 記住打開的文件和報告嗎?”下次再重新打開嗎?”
有“是”、“否”和“取消”按鈕以及“不要再詢問我有關保存會話的信息”的複選框。
我懷疑該對話框也以批處理模式出現,並且 JMP 正坐在那裡等待響應。
所以我勾選了“不要再問我”框並關閉了 JMP。
然後在任務計劃程序中手動觸發我的批處理作業......您知道什麼,它成功運行並正確終止,並在任務計劃程序中註明“操作成功完成”。
回復以更好地關注此主題。powershell 解決方案無法完全解決我的問題,因為我的腳本似乎在 Exit(); 之前掛起。命令。我的腳本掛在 Exit(); 之前的 NW << Save Journal("path") 處。儘管對於其他所有問題我都遇到完全相同的問題,但手動或通過 .bat 文件運行腳本不會產生任何問題。僅當我通過任務計劃程序運行腳本時,它才會掛起。
感謝您的建議!
不幸的是,即使在運行 powershell 腳本後我仍然收到 JMP 執行錯誤......太奇怪了。
對於關注此線程的其他人,我必須在 powerscript 提示符處使用 set-executionpolicy remotesigned -scope currentuser 命令啟用 powerscript shell 腳本執行,以允許腳本運行...
我還沒有找到問題的根本原因解決方案。但你並不是唯一一個告訴我 exit() 並不總是有效的人。不過我現在確實有一個解決方法。
我必須讓我的丈夫,一個真正的程序員,來做這件事。現在我欠他一個香蕉奶油派。
這個 Powershell 小程序實際上解決了某人可能感興趣的另一個 JMP 特定問題。我的一個腳本想要打開一個 html 地址並從那裡獲取表格信息。但是,該位置受密碼保護。我找不到 JMP 將我的憑據傳遞到 JSL 中的網站的方法,它只是失敗了。然而,它只是在沒有憑據的情況下工作如果我最近打開了該網站並在 Internet Explorer 中輸入了憑據。JMP似乎使用了IE cookies。無論如何,這就是該程序有一個名為“loginpage”的命令行選項的全部原因。它對於 JMP 退出問題來說是多餘的,但它可以選擇在某個網頁上打開 IE,根據需要傳遞硬編碼憑據,然後關閉 IE。
“waitforlog”是相關的。該方案的工作方式是,當 JMP 腳本運行時,它會在完成後在最後發布某個日誌文件。與 exit() 不同,這似乎可靠地發生。該程序會刪除該文件的任何先前版本,打開 JMP,運行腳本,然後等待文件重新出現。當它這樣做時,它知道它可以殺死 JMP,並且它已經計算出它打開的 JMP 實例的進程 ID,並僅殺死該實例。
我有一個早期的解決方法,使用taskkill定期殺死所有打開的JMP,但似乎在一個簡單的批處理文件中知道您剛剛啟動的特定實例並不容易,因此您可以使用taskkill殺死該特定實例。由於我有許多預定的作業,並且還想使用這台機器打開 JMP 並在作業在後台運行時執行一些手動工作,因此隨意終止 JMP 實例並不是一個很好的解決方案。Powershell 似乎有一種特殊的能力來識別您剛剛啟動的程序的特定實例。
無論如何,這個 Powershell 解決方案現在對我來說適用於這兩個問題......
這是運行它的 .bat 文件中的語法示例......(最後兩件事是可選的)
powershell "&"C:\SCHEDULED\runJMPscript. ps1" -script 'C:\SCHEDULED\yourJSLscript.JSL' -waitforlog -loginpage
就像我說的,我自己沒有寫這個,登錄部分是基於我在另一個論壇中找到的關於啟動IE 並讓它做更多事情的東西,而這些事情只需在一個簡單的批處理文件中就可以完成。不過,這還是相當容易理解的。請注意,JMP 的位置是硬編碼在那裡的,您需要更改腳本以使其創建名稱為帶有 .log 擴展名的腳本名稱的日誌文件。
#************************************************* ******* **************************
#
# RunJmpScript.ps1 - 用於運行 Jmp 命令的 PowerShell 腳本
#
# 用法:
#
# powershell.exe RunJmpScript.ps1 [-loginpage] -script 腳本名 [-waitforlog]
#
#************************************************* ******* **************************
param ([開關]$loginpage, [字符串]$script = "未知", [開關]$waitforlog)
#
# 檢查命令行選項是否有錯誤
#
寫入主機“登錄頁面:$登錄頁面”
寫入主機“腳本:$ script”
寫入主機“waitforlog:$waitforlog”
$scriptexists = (測試路徑 $script -PathType Leaf)
if (!($腳本存在))
{
Write-Host“錯誤:必須使用 -script 指定 Jmp 腳本文件的位置”
1號出口
}
#
# 如果需要的話,檢索登錄頁面信息
#
如果($登錄頁)
{
# 定義一些會根據你的配置而改變的變量
# 我建議將它們存儲為 XML 文件並在執行時讀取它們
# 時間,但為了這個練習,我保持簡單。
$username = "在此填寫用戶名"
$password = "在此填寫密碼"
$url = "在此填寫網址"
# 創建 IE com 對象
$ie = new-object -com InternetExplorer.Application
# 跳轉到登錄頁面
$ie.navigate($url)
# 等待頁面加載完成
執行 {sleep 1} 直到 (-not ($ie.Busy))
#$ie.visible = $true #取消註釋以進行調試
# 將 DOM 分配給 $doc 變量
$doc = $ie.文檔
# 填寫登錄信息
嘗試 {
# 找到用戶名字段並將值設置為變量的值
$usernameField = $doc.getElementById('USER')
$usernameField.value = $用戶名
# 找到密碼字段並將值設置為結果的值
# 使用頂部定義的參數調用 get-password 函數
$passwordField = $doc.getElementById('PASSWORD')
$passwordField.value = $密碼
# 找到並點擊提交按鈕
$submitButton = $doc.getElementById('提交')
$submitButton.click()
# 等待登錄完成
執行 {sleep 1} 直到 (-not ($ie.Busy))
} 捕獲 {$null}
# 等待頁面加載完成
執行 {sleep 1} 直到 (-not ($ie.Busy))
# 關閉IE
$ie.quit()
}
#
# 如果我們要監視當前日誌文件,請刪除它
#
$logfile = $script + ".log"
如果($waitforlog)
{
if (測試路徑 $logfile -PathType Leaf)
{
Write-Host“刪除現有日誌文件 $logfile”
刪除項目 $logfile
}
}
#
# 執行Jmp命令,使用指定的腳本
#
$exe = "C:\Program Files\SAS\JMP\9\jmp.exe"
$exeargs = "`"" + $script + "`""
Write-Host“使用參數啟動進程 $exe:$exeargs”
$jmp = 啟動進程 $exe "$exeargs" -passthru
#
# 看看我們是否需要等待它寫出日誌文件。
#
如果($waitforlog)
{
$logfile = $script + ".log"
$idval = $jmp.Id
Write-Host“正在等待來自進程 $idval 的日誌文件 $logfile”
while (!(測試路徑 $Logfile -PathType Leaf))
{
# 如果進程退出,我們現在就可以退出
if ($jmp.HasExited)
{
出口0
}
# 否則,稍等一下,然後重試
開始-睡眠-s 1
}
Write-Host“停止外部程序$idval”
停止進程 $idval
}
出口0
在使用任務計劃程序時,我也遇到過使用 exit(nosave) 命令的類似問題...當我在 JMP 中運行 jsl 腳本時,它工作正常。
我之前並沒有看到它實際上不接近,但我得到了以下 2 個結果(相同的腳本,不同的機器):
1)程序按預期關閉
2) 我收到“JMP 異常!”警報窗口顯示 JMP 發生了訪問衝突並將關閉。如果不可能,錯誤信息將被複製到 My dcouments 文件夾或用戶本地應用程序數據文件夾中的 JMPExcept.jer。如有必要,可以將錯誤信息通過電子郵件發送給 JMP 技術支持。
就我而言,我在運行 bat 文件時也得到了這些結果,但是當我從 JMP 正常運行 JSL 腳本時,它每次都能工作。
我實際上也看到了它有時在同一台機器上工作的地方,而不是其他地方。
如果有人有任何其他經驗(或解決方法),我想听聽。我確實向 JMP 支持人員發送了一封電子郵件,但他們不知道為什麼行為有所不同。