• 締切済み

VBSのプログラムをタスクスケジューラで実行するとエラーになります。

初めまして。 調べてみても同様の事例が見つからず、理解のきっかけも想像出来ませんでしたので質問させてください。 現象としては、「ログオンしている状態であればダブルクリックで動かしても、スケジューラを使って動かしても問題なく動くVBS」を作成しました。(ソースは末尾に記載します。) しかし、「コンピュータのロックがかかっている状態(時間が経つと勝手にロックがかかる仕様になっています)」でタスクスケジューラを使いスクリプトを動かすとエラーになるというものです。 ソースは↓ 要するに特定のWEBページの情報を持ってきて置換処理をしいらない部分を削除し、メールで送信する。というスクリプトです。 ----------------------------------------------------------- Set WSHFso = CreateObject("Scripting.FileSystemObject") Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate("http://") Set WshShell = WScript.CreateObject("WScript.Shell") Do While IE.Busy Wscript.Sleep 10 Loop '↓開いたらログイン処理やページ移動処理などをして 目的のページ移動する処理があり、目的のページを開いたら↓の処理に続きます。 Do While IE.Busy WScript.Sleep 10 Loop '目的のページをテキストデータで読み込みます。 Do While IE.Document.readyState <> "complete" WScript.Sleep 100 Loop Dim Schedule '読み取ったページ内容を変数に格納します。 Schedule = IE.Document.Body.InnerText 'テキストデータの中からいらない情報を置換して消していきます。 後の処理をみると無駄な作業に見えますが諸事情により必要な処理です。 Schedule = Replace (Schedule,"89101112131415161718192021222324","") Schedule = Replace (Schedule,"891011121314151617181920212223","") Schedule = Replace (Schedule,"8910111213141516171819202122","") Schedule = Replace (Schedule,"89101112131415161718192021","") Schedule = Replace (Schedule,"891011121314151617181920","") Schedule = Replace (Schedule,"8910111213141516171819","") Schedule = Replace (Schedule,"reserved.","") 'テキストデータの中で固有のデータ(データ取得時の西暦)があるので、 それをInStrで探し出し、Midを使って固有のデータ移行のテキストデータを strScheduleの中に格納しています。 Dim strFind Dim counterStart Dim strSchedule strFind = Year(Now) counterStart = InStr(Schedule, strFind) strSchedule = Mid(Schedule,counterStart) Dim nowdate   nowdate = Date() Call SendMail("aaa@aa.com", nowdate & "のスケジュール",strSchedule) '-------------- ↓サブルーチン↓ ----------------- 'メール送信 Sub SendMail(mailto,subj,body) Set bobj = CreateObject("basp21") Dim smtp '--SMTPサーバー smtp = "mail.aaa.com" mailfrom = "sysadmin@aaa.com" files = "" msg = bobj.SendMail(smtp,mailto,mailfrom, subj,body,files) End sub '------------- ↑サブルーチン↑ ----------------- IE.Quit Set objIE = Nothing ----------------------------------------------------------- 上記のソースの中で「strSchedule = Mid(Schedule,counterStart)」の部分でエラーが走ってしまいます。 内容としては、要するにMidの引数がふさわしくないとのことなのですが、 試しに「counterStart」を実際に当てはまる数字(テキストデータ全体の文字数よりも少ない数字)にしてもエラーが走ります。 現状は運用の方法を変え(いつまで経ってもロックされない仕様にしました。) 対応して問題なく動いているところですが、いまいち腑に落ちなく投稿いたしました。 どなたかご教授いただけますと幸いです。

みんなの回答

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

> IE.Visible = True の部分をカットするとどうなりますか? デスクトップがない(ログインしていない)のにウィンドウを表示させようとすると基本的にエラーになると思いますが・・・

yuko8320
質問者

補足

>> IE.Visible = True >の部分をカットするとどうなりますか? レスポンスが遅くなりまして、申し訳ありません。。 早速試してみましたところ、同様に >上記のソースの中で「strSchedule = Mid(Schedule,counterStart)」の部分でエラーが走ってしまいます。 >内容としては、要するにMidの引数がふさわしくないとのことなのですが、 >試しに「counterStart」を実際に当てはまる数字(テキストデータ全体の文字数よりも少ない数字)にしてもエラーが走ります。 のエラーが走ります・・・。

関連するQ&A

  • VBSでMid関数を使ったらエラーが出た(文字列の一部を切り出したい)

    お世話になっております。 VBSでテキスト(文字列)の一部を切り出したいのですが、Visual basicのやり方だとエラーが出てしまいます。 つまり、Mid関数を使ったらエラーが出て、対処がわかりません。 以下に具体的なものを示します。 インターネットホームページの中からテキストを取得して、そのテキストから一部分を切り出したいのです。 例えば切り出したテキストが「赤1、青2、黄3」だとします。色名+数字、色名+数字、色名+数字というテキストです。色名を指定して、その次の数字を切り出したいのです。最終的には切り出した数字をc:\textfile.txtに保存しようとしております。 Dim IE dim price Set IE = WScript.CreateObject("InternetExplorer.Application") IE.Navigate ("http://hoomupeeji") While IE.busy: Wend While IE.Document.readyState <> "complete": Wend Dim fs Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.CreateTextFile("C:\textfile.txt", True) For Each r In IE.Document.All.tags("TABLE")(3).rows For Each c In r.Cells a.Write (Replace(c.innerText, vbCrLf, ",")) Next Next price = Mid(a, InStr(price, "赤") , 1) a.Write (price) a.Close IE.quit どうぞよろしくお願いいたします。

  • VBSでバッチを実行できません。

    C:\temp\test.batをVBSで実行しようとするのですが、 何度やっても実行されません。 想像ですが、c:\WINNT\System32\cmd.exeが動いている ようなのですが、肝心のC:\temp\test.batが動きません。 以下のように記述しました。 Dim WshShell Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run ("cmd /c c:\temp\test,0,True") WIN2K、IE6.0の環境です。 どこか記述に誤りでもあるのでしょうか? どうぞよろしくお願いいたします。

  •  VBSの作り方がわかりません

    下記のようなVBSを使いたいのですが   テキストでなくエクセルをアクティブにしたいのですがうまくいきません   どのように直せばよいのかお教えください。  お願いいたします。 Dim excel With CreateObject("Wscript.Shell") .Run "D:\DATA\T.txt" End With On Error Resume Next Set excel = GetObject(, "Excel.Application") If Err.Number <> 0 Then Set excel = CreateObject("Excel.Application") End If excel.Visible = True excel.Workbooks.Open "D:\DATA\Sin1.xls"

  • VBSバックアップ

    バックアップスクリプト(VBS)について教えて下さい。 単純にディレクトリをバックアップするスクリプトは、出来たのですが これに付加機能を与えたいです。 ◆世代管理をしたい。 ◆iniファイルから、バックアップ元と先、管理する世代等の情報を読み込みたい。 <bkup.vbs> Option Explicit Const ForReading = 1 '読み込み Const ForWriting = 2 '書きこみ(上書きモード) Const ForAppending = 8 '書きこみ(追記モード) Dim objFileSys Dim objShell Dim strCopyFrom Dim strCopyTo Dim strToDir Dim strNewDate WScript.echo "バックアップを開始します" Set objFileSys = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") strNewDate = Year(Now) & _ Right(("0" & CStr(Month(Now)+0)),2) & _ Right(("0" & CStr(Day(Now)+0)),2) strCopyFrom = "C:\vbs" strToDir = "C:\backup" strCopyTo = objFileSys.BuildPath(strToDir,strNewDate) If objFileSys.FolderExists(strCopyTo) = True then WScript.echo "指定のパスには既にディレクトリが存在する為、" & _"バックアップ処理を中断します。" WScript.Quit Else objFileSys.CopyFolder strCopyFrom,strCopyTo WScript.echo "バックアップ処理は正常に完了しました。" End If Set objFileSys = Nothing Set objShell = Nothing 宜しくお願い致します。

  • vbsでexcelのクリアとフォームの表示をしたい

    お世話になっております。 vbsの以下の記述でexcelを開いています。 開くところまでは行くのですが、その後のsheet1のデータのクリアとUserForm1の表示がどうしてもできません。 申し訳ありませんが、どなたかおわかりの方、教えていただけないでしょうか。 宜しくお願いいたします。 Dim oApp Dim objWshShell Dim scriptPath 'Excelオブジェト作成 Set oApp = CreateObject("Excel.Application") 'WScript.Shellオブジェクト作成 Set objWshShell = CreateObject("WScript.Shell") oApp.Visible = True '不可視にする oApp.UserControl = True 'Excelファイルを開く scriptPath = WScript.ScriptFullName scriptPath = left(scriptPath,len(scriptPath)-len(WScript.ScriptName)) oApp.Workbooks.Open scriptPath & "共同資料.xlsm"

  • IEを探すプログラムがうまくいきません。

    VBScriptで指定するサイトが開いていなかった場合とある処理を行い、とあるサイトが開いていれば別の処理をし終了させることをやっていますがうまくいきません。 自分の考えとしては 1・開いているIEをくるくるループ回して探す 2・その中にヤフーがあればフラグをTrue処理   それ以外はFalse処理 これだけで終わりにしたいのですが・・・ Dim objIE Dim objShell Dim objWindow Dim WinExist Dim strURL Dim Flug Dim strURL2 strURL = "http://www.yahoo.co.jp/" strURL2 = "http://www.google.co.jp/" 'IEが起動して無い場合プログラムが起動しないのでダミー立ち上げ Set objIE = WScript.CreateObject("InternetExplorer.Application") objIE.Navigate "about:blank" objIE.Visible = True Set objIE = Nothing WinExist = False Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows If TypeName(objWindow.Document) = "HTMLDocument" Then WinExist = True Set objIE = objWindow End If Next If objIE.LocationURL = strURL Then Flug = True Else If objIE.LocationURL <> strURL Then Flug = False Else WScript.sleep(1) End If If Flug = False Then Set objIE = WScript.CreateObject("InternetExplorer.Application") objIE.Navigate strURL2 objIE.Visible = True Set objIE = Nothing End If ' 'いろいろな処理があるが省く ' If Flug = True Then msgbox "ヤフー存在" End If End If 絶対にフラグがTrueになることがありません。 Excelでデバッグしてみましたがなぜうまくいかないのかが理解できておりません。 自分としては開いているIEをぐるぐるとまず回ってヤフーが開いていればTrue時の処理を行い終了、 なければFalse時の処理を行うという風にしたいです(無限ループではありませんでした) For eachを使っているので途中でIf Flug以降の処理を行ってしまうのも無駄な繰り返しで困ってしまいます。 そこでフラグを立てることを考えたのですがどうも思うようにいきません。 ボキャブラリが足りませんが、いい知恵を貸していただけないでょうか?

  • VBScriptでオートパイロットプログラムを作ったのですが

    環境は、VB 6.0 SP5 です。 以下のようにVBでプログラミングしたんですが(VBScript含む)、続けて違うIDでログインしようとすると、該当ページが前のIDでログインしたままになっていて、動作が不安定です。普通にIEを立ち上げるてログインした場合、2回目に立ち上げた状態は、ログイン前のまっさらなページが表示されますよね。 何が問題なのでしょう? ご教授願えないでしょうか。   Dim WshShell As Object   Dim objIe As Object   Set WshShell = CreateObject("WScript.Shell")   Set objIe = CreateObject ("InternetExplorer.Application")   objIe.Navigate("該当ページのURL")   objIe.Visible = True   WshShell.AppActivate (objIe)   ログイン処理・・・   同じ事を繰り返す・・・

  • ASPからVBS実行時の権限

    ASPからWscript.Shellを使ってVBSを実行しているのですが、 ASP中のDBオープンには問題はないのですが、test.vbs中でオープンできません LOGファイルは"dbConnection-OK"までになっています。 権限の問題かどうかはわからないのですが、原因は何でしょうか? DBはODBC経由のSQLServerです。 ---------ASP-------------------------------------- <% Dim dbConnection Set dbConnection = CreateObject("ADODB.Connection") dbConnection.Open "testdb" dbConnection.Close Set dbConnection = Nothing '上記OPENに関して問題なし Dim WshShell Set WshShell = CreateObject("Wscript.Shell") WshShell.Run "cscript.exe e:\test.vbs 123", 0, True Set WshShell = Nothing %> <html> <head> <meta http-equiv="Cache-Control" content="no-cache" /> <title>Pipot.to</title> </head> <body> OK </body> </html> ---------test.vbs-------------------------------------- Dim ObjFSO Dim ObjTS Set ObjFSO = CreateObject("Scripting.FileSystemObject") Set ObjTS = ObjFSO.CreateTextFile("e:\log.txt") ObjTS.Write "LOG開始" Dim dbConnection Set dbConnection = CreateObject("ADODB.Connection") ObjTS.Write "dbConnection-OK" dbConnection.Open "testdb" ObjTS.Write "OPEN-OK" dbConnection.Close Set dbConnection = Nothing ObjTS.Close Set ObjTS = Nothing Set ObjFSO = Nothing

  • vbsでテキストファイル内の文字列検索

    初心者です。 テキストファイルを指定し、含まれる文字列を検索し、 結果表示したいと考えております。 色々探して、以下で作成したのですが、 うまく動いてくれません。 出来ましたら、テキストファイルの中の文字列の 一部分を指定して動作させたいと思っております。 どなたかご教示のほど宜しくお願い致します。 ---------------------------------------------------- Set WSHFso = CreateObject("Scripting.FileSystemObject") Set WshShell = WScript.CreateObject("WScript.Shell") Dim strSearchWord Set tmpFile = WSHFso.OpenTextFile("C:\AAA.txt") Do Until tmpFile.AtEndOfStream tmpLine = tmpFile.ReadLine strSearchWord = strSearchWord & tmpLine & vbcrlf Loop Dim SearchWord SearchWord = split(strSearchWord," ") if InStr(SearchWord(ix), "test")<>0 then WScript.Echo " testを含みます。" else WScript.Echo " testを含みません。" end if ----------------------------------------------------

  • VBscriptでIEスクリプト動かない

    VBScript初心者です。HTMLに書かれた文字を取ってきて環境変数に入れるスクリプトを作っているのですが、うまく動きません。かなりデバッグも頑張りましたしレファレンスも見ましたが解決に至らず。ご教示お願い致します。 Dim ie Set ie = CreateObject("InternetExplorer.Application") ie.visible = True Dim wshShell Dim wshUserEnv Set wshShell = CreateObject("WScript.Shell") Set wshUserEnv = wshShell.Environment("User") Main Public Function Main() Dim hirake Dim nakami Dim taagetto Dim kekka hirake = "etqw.dip.jp" ie.Navigate hirake Do Until ie.Busy = False Or ie.readystate <= 3 WScript.Sleep 100 Loop WScript.Sleep 100 nakami = ie.Document.getElementsByClassName("status-table") Set taagetto = nakami(2).innertxt Set kekka = Mid(taagetto,InStr(taagetto,"Password:") + 1) wshUserEnv.Item("_KOREDAYO") = kekka ie.Quit Set ie = Nothing Set hirake = Nothing Set nakami = Nothing Set taagetto = Nothing Set kekka = Nothing End Function

専門家に質問してみよう