0

ActiveX ScriptSQl Serverのジョブ内で次のコードを使用して、 X分ごとにURLを呼び出しています。

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "iexplore.exe http://www.google.com.br"
Set WsShell = Nothing

動作していますが、作成されたプロセスは実行を続けます。 ここに画像の説明を入力してください

そのコードを変更してURLを呼び出し、最近呼び出されたプロセスを強制終了するか、「有効期間」で呼び出す方法。私はそれがより安全だと思います、私は間違ったプロセスを殺したくありません。

4

4 に答える 4

1

CURL( http://curl.haxx.se/docs/manpage.html)やWGET(http://www.gnu.org/software/wget/ )などの軽量のコマンドラインURL取得プログラムの使用を検討できますか?これらのプログラムは、コマンドラインから非常に簡単に実行できます。

wget http://www.google.com
curl http://www.google.com

次のようにVBScriptから実行できます。

sub shell(cmd)
    ' Run a command as if you were running from the command line
    dim objShell
    Set objShell = WScript.CreateObject( "WScript.Shell" )
    objShell.Run(cmd)
    Set objShell = Nothing
end sub

shell "wget http://www.google.com"

これの唯一の欠点は、WGETとCURLがjavascriptを実行したり、関連する画像をダウンロードしたり、HTMLをレンダリングしたりしないことです。彼らは単にウェブページをダウンロードするでしょう。私の経験では、単一のHTMLページを取得するだけでよい限り、CURLとWGETを定期的に使用しています。しかし、何かをレンダリングしたり、AJAX関数をトリガーしたりする必要がある場合は、Selenium、WATIN、IMacrosなどの自動化可能なWebブラウザーツールキットを使用します。

于 2012-08-23T21:22:42.753 に答える
1

IEを起動する方法は外部であり、一度起動するとプロセスをほとんど制御できません。よりインタラクティブな方法はこのようなものです

Function GetData(strUrl) 'As String
  Set web = CreateObject("InternetExplorer.Application")
  web.Navigate strUrl
  Do While web.Busy
    wscript.sleep 100
  Loop
  Set doc = Nothing
  Do Until Not doc Is Nothing
    Set doc = web.Document
  Loop
  strWebPage = doc.all(1).innerHTML 'This does return the head sections
  web.Quit
  GetData = strWebPage
End Function


wscript.echo GetData("www.google.com")
于 2012-08-23T13:40:16.837 に答える
1

更新:現在のところ、これは実行可能な解決策ではないようです。複数回呼び出した後、IEプロセスもこのアプローチで蓄積され始めます。この動作は、IEのセッション管理と関係があるようです。IEは突然終了するのが好きではありません。


ここで、WMIを介したプロセスの管理に関する非常に役立つ情報をいくつか見つけました。それをベースにして、以下に示すコードを思いつきました。WMIアプローチの優れた点の1つは、プロセスの一意のIDへのアクセスが許可されることです。さらなる改善(例外処理の追加を含む)が可能であると確信しているので、私のコードを出発点と考えています。

おそらく、WMIについての深い知識を持つ他の人が、追加のアドバイスを提供できます。

PS:この機能をと呼ばれるVBScriptクラス内にラップしたことを願っていますProcess

Option Explicit

' Const PROG = "notepad.exe"
Const TARGET = "http://www.google.com"
Dim PROG : PROG = "C:\Program Files\Internet Explorer\iexplore.exe " & TARGET
Const ABOVE_NORMAL = 32768  ' what are the other priority constants?

Dim oProc : Set oProc = New Process
oProc.Name = PROG
' oProc.Priority = ABOVE_NORMAL
oProc.Launch

WScript.Echo "Launched '" & PROG & "' with process ID '" & oProc.ID & "'"
WScript.Sleep 5000
oProc.Terminate
WScript.Echo "Process " & oProc.ID & " killed."
Set oProc = Nothing

' ----------------------------------------------------------------------

Class Process

Public Computer
Public Name
Public Priority
Public ID
Public IsRunning

Private mHandle

Private Sub Class_Initialize()
    Me.Computer = "."
    Me.Name = Null
    Me.ID = -1
    Me.Priority = Null
    Me.IsRunning = False
    Set mHandle = Nothing
End Sub

Private Sub Class_Terminate()
    Set mHandle = Nothing
End Sub

Public Sub Launch()
    Dim oWmi, oStartup, oConfig
    Dim nPid

    Set oWmi = GetObject("winmgmts:" _
                         & "{impersonationLevel=impersonate}!\\" _
                         & Me.Computer & "\root\cimv2")

    Set oStartup = oWmi.Get("Win32_ProcessStartup")

    If Not IsNull(Me.Priority) Then
        Set oConfig = oStartup.SpawnInstance_
        oConfig.PriorityClass = Me.Priority
    End If

    Set mHandle = GetObject("winmgmts:root\cimv2:Win32_Process")
    mHandle.Create Me.Name, Null, oConfig, nPid
    ' WScript.Echo "TypeName Is [" & TypeName(mHandle) & "]"
    Me.ID = nPid
    Me.IsRunning = True
End Sub

Public Sub Terminate()
    ' mHandle.Terminate  ' hmmm, doesn't work...

    Dim oWmi
    Dim colProcessList, oProc

    Set oWmi = GetObject("winmgmts:" _
                                  & "{impersonationLevel=impersonate}!\\" _
                                  & Me.Computer & "\root\cimv2")

    Set colProcessList = oWmi.ExecQuery _
        ("Select * from Win32_Process Where ProcessId = '" & Me.ID & "'")

    For Each oProc In colProcessList  ' should be only one process
        ' WScript.Echo "TypeName Is [" & TypeName(oProc) & "]"
        oProc.Terminate
    Next

    Me.IsRunning = False
End Sub

End Class
于 2012-08-23T19:13:17.183 に答える
1

@Tedによる提案のフォローアップとして、Microsoftのネイティブ機能を使用してURLを処理中にフェッチすることもできます。これは、WinHTTPと呼ばれるコンポーネントを介して実行できます(最新のものはWinHTTP 5.1のようです)。

以下の私のスクリプトを参照してください。このスクリプトには、URLのステータスを取得するだけの関数が含まれています。このスクリプトを実行すると、次の出力が得られます。

http://www.google.com => 200 [OK]
http://www.google.com/does_not_exist => 404 [Not Found]
http://does_not_exist.google.com => -2147012889
    [The server name or address could not be resolved]

URLの背後にある実際のコンテンツが必要な場合は、を試してくださいoHttp.ResponseText。他の機能にも興味がある場合は、WinHTTPリファレンスをご覧ください。

Option Explicit

Dim aUrlList
aUrlList = Array( _
    "http://www.google.com", _
    "http://www.google.com/does_not_exist", _
    "http://does_not_exist.google.com" _
)

Dim i
For i = 0 To UBound(aUrlList)
    WScript.Echo aUrlList(i) & " => " & GetUrlStatus(aUrlList(i))
Next

Function GetUrlStatus(sUrl)
    Dim oHttp : Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1")

    On Error Resume Next

    With oHttp
        .Open "GET", SUrl, False
        .Send
    End With

    If Err Then
        GetUrlStatus = Err.Number & " [" & Err.Description & "]"
    Else
        GetUrlStatus = oHttp.Status & " [" & oHttp.StatusText & "]"
    End If

    Set oHttp = Nothing
End Function
于 2012-08-24T13:49:16.293 に答える