VBSからbat実行(WMI)して戻り値を取得する

このQ&Aのポイント
  • WSH初心者のため、WSH(remote.vbs)からWMIを使用して別サーバのA.batを実行し、A.batの戻り値を取得する方法を教えてください。
  • remote.vbsファイルでWMIを使用して別のサーバのA.batを実行していますが、どのようにA.batの戻り値を取得すれば良いですか?
  • VBSからWMIを使用して別のサーバのA.batを実行していますが、A.batの戻り値を取得する方法を教えてください。
回答を見る
  • ベストアンサー

VBSからbat実行(WMI)して戻り値を取得する

WSH初心者です。 WSH(remote.vbs)からWMI使用で別サーバのA.batを実行しているのですが、 A.batの戻り値はどのように取得すれば良いのでしょうか? -■remote.vbs(一部抜粋)------------------------------------------ ' #WMI に接続 Wim32_Process クラスを取り出す Set clsProcess = GetObject("winmgmts:{impersonationLevel=impersonate}" & "!" & リモート先PC & "Win32_Process") ' #プロセスの作成 lngResult = clsProcess.Create(A.bat, null, null, processId) -------------------------------------------------------------- -■A.bat------------------------------------------ exit /B %RetCode% ------------------------------------------------- A.batで返している%RetCode%の値をremote.vbs側で取得したいのです。 どなたかご存じでしたらご教授の程よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8522/19371)
回答No.1

>A.batで返している%RetCode%の値をremote.vbs側で取得したいのです。 取得は出来ません。 A.batの終了値はA.batを起動したシェル(cmd.exe等)には伝わりますが、それより上位(呼び出し元)には伝わりません。 上位に伝わるのは「シェル(cmd.exe等)の終了コード」であり、それは「常に、正常終了を意味する0」です(cmd.exeが「リードエラー。(A)bort,(R)etry,(F)ail?」などの致命的エラーを吐いて強制終了した場合のみ、0以外が返ってきます) こういう事をしたい場合は -■A.bat------------------------------------------ echo %RetCode% > result.txt exit ------------------------------------------------- など、結果をテキストファイルなどに吐き出させ、呼び出し元に戻ってきてから、吐き出されたテキストファイルをオープンして中身を読み込んで結果を得るしか、方法はありません。 また、呼び出し元で、呼び出したプロセスが終了したかどうか判らない場合もあるので、その場合は、以下のようにします。 1.呼び出し元で、結果ファイルを削除する。 2.リモートでプロセスを起動する。 3.呼び出し元は、結果ファイルが生成されるまで待つ。 4.呼び出されたプロセスは、終了時に結果ファイルを生成する。 5.呼び出し元が結果ファイルの生成を検知したら、中身を読んで結果を取り出す。

urahyster
質問者

お礼

ご回答有難うございます。 直接は受け取れないのですね。。 ファイルでの授受は成功しました!ご回答有難うございました☆

関連するQ&A

  • VBSからリモートでbat実行(WMI)

    VBS初心者です。 別端末上のbatファイルを別ユーザでリモート実行したいのですが、 以下のソースでエラーが起きてしまいます。(result が2で返ってきてしまう) どなたか原因がお解りになりましたらご教授宜しくお願い致します。 ----------------------------------------------------- RemoteExecute "リモート先","ドメイン\User","pass","C:\test.bat" Function RemoteExecute(strServer, strUser, strPassword, CmdLine) Const Impersonate = 3 RemoteExecute = -1 Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer(strServer, "root\cimv2", strUser, strPassword) Service.Security_.ImpersonationLevel = Impersonate Set Process = Service.Get("Win32_Process") result = Process.Create(CmdLine, , , ProcessId) If (result <> 0) Then WScript.Echo "Creating Remote Process Failed: " & result Wscript.Quit End If RemoteExecute = ProcessId End Function -----------------------------------------------------

  • VBSについて教えてください。

    VBSについて教えてください。 イベントビューワのプロパティの変更(最大ログサイズとログサイズが最大値に達した時の操作)を以下のスクリプトにて変更したいと思っています。(スクリプトはhttp://www.microsoft.com/japan/technet/scriptcenter/scripts/logs/eventlog/lgevvb16.mspxで公開されているのを利用しています。) strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate,(Security)}!\\" & _ strComputer & "\root\cimv2") Set colLogFiles = objWMIService.ExecQuery _ ("Select * from Win32_NTEventLogFile") For each objLogfile in colLogFiles strLogFileName = objLogfile.Name Set wmiSWbemObject = GetObject _ ("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2:" _ & "Win32_NTEventlogFile.Name='" & strLogFileName & "'") wmiSWbemObject.MaxFileSize = 1024000 wmiSWbemObject.OverwriteOutdated = 0 wmiSWbemObject.Put_ Next WindowsXPSP2では動作したのですが、Windows2000SP4では以下のエラーが発生します。 Windows Script Host スクリプト:スクリプトの場所 行:14 文字:5 エラー:WBEM_FLAG_USE_AMENDED_QUALIFIERSが指定されていない場合は修正オブジェクトを置くことはできません コード:80041066 ソース:SWbemObject VBSについては全く理解できておりません。 Windows2000で動作させるためにんはどこを修正すればいいでしょうか?

  • VBScript(WHS)でWMIを使ってリモートでvbsファイルを実行したい

    サーバAから、サーバBに置いてあるvbsファイル(Apache停止が書かれている)を実行して、サーバBのApacheを停止したいのですが、うまくいきません。 サーバBで単体でそのvbsファイルを実行すると、Apacheは正常に停止します。  戻り値は、0(プロセス完了)が帰ってきていて、接続はうまくいっているようなのですが、vbsファイルが実行されていないようです。  非常に困っておりまして、どなたか教えていただけないでしょうか? vbsファイルの実行のところが間違っているのかなと思うのですが・・・(今まだ会社にいないので、会社でのソースそのままではないですが、同じような感じです) -------------------------------------------- Option Explicit Dim strComputer Dim strUser Dim strPassword Dim strBAT ' ----------------------------------- ' 環境設定 ' ----------------------------------- strComputer = "サーバーB" strUser = "username" strPassword = "password" strBAT = "c:\hoge.bat" ' ----------------------------------- ' コマンド実行 ' ----------------------------------- Dim objWbemLocator Dim objWMIService Dim objWin32_Process Dim errReturn Dim intProcessID Const WbemAuthenticationLevelPktPrivacy = 6 ' リモートに接続 Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objwbemLocator.ConnectServer _ (strComputer, "root\cimv2", strUser, strPassword) objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy ' Win32_Process クラスを生成 Set objWin32_Process = objWMIService.Get("Win32_Process") errReturn = objWin32_Process.Create _ ("cmd.exe /cscript C:\tmp\ApacheStop.vbs", Null, Null, intProcessID) WScript.Quit(errReturn ) もともとの要件は、機能ごとに分けたvbsファイル(Apache停止、Windows再起動、ファイルバックアップなど)を、各サーバで実行するというものです。その制御は、ひとつのバックアップサーバーで行います。

  • vbsでループさせる

    vbsでループさせる http://nagabuchi.jugem.jp/?eid=237 で作ったバッチで常駐ソフト(自分はSkydriveとかのクラウドサービス)の起動を遅らせる事ができるようになり、めでたしめでたしなんですが、 セキュリティソフト(KasperskyInternetSecurity2013)より先に常駐ソフトが立がるのは問題だろうと思い、 上記URLで作成する.vbsを改良しようと思いました。 http://q.hatena.ne.jp/1203153427 を参考に以下に示すような感じに変更してみたものの、CreateObjectの行がうまくいきません。 KasperskyInternetSecurity2013 (実行ファイルはC:\Program Files (x86)\Kaspersky Lab\Kaspersky Internet Security 2013にあるavp.exe) が起動した後にstartup.batを起動するにはどうすればいいでしょうか? wait9s.batの中身 ping -n 9 127.0.0.1 > nul 問題の.vbsファイル Sub StartAfterKaspersky() Const program_name = "avp.exe" Dim x For x = 1 To 10 If processCheck(program_name) = Ture Then CreateObject("WScript.Shell")ws.run "cmd /c startup.bat",vbhide Else CreateObject("WScript.Shell")ws.run "cmd /c wait9s.bat",vbhide End If Next MsgBox "27秒も待ったのに、Kasperskyが起動しません。強制起動します。" CreateObject("WScript.Shell").Run program_name End Sub '//------------------------------------------------ ' プロセスが動いているかチェックする関数 '//------------------------------------------------ Function processCheck( pName ) '//------------------------------------------------ processCheck = False Dim objPWMI On Error Resume Next Set objPWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\localhost\root\cimv2") Err.Clear On Error GoTo 0 If Err.Number <> 0 Then Exit Function '接続できなかったら、終了 Dim colProc Set colProc = objPWMI.ExecQuery("Select * from Win32_Process WHERE Name='" & pName & "'") If colProc.Count > 0 Then processCheck = True End Function

  • 任意のプログラムを終了させてからシャットダウンプログラムを走らせるには?

    すいませんが、質問させていただきます。 現在Windows XPにて他のサイトにあった「poweroff.vbs」 --------- Set objSystemSet = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}").InstancesOf("Win32_OperatingSystem") For Each objSystem In objSystemSet objSystem.Win32Shutdown 8 Next) --------- を、使用しタスクで自動シャットダウンをしていますが、 シャットダウンをさせるより先に任意のプログラム(.exe)を終了させてから上記の「poweroff.vbs」を実行するにはどうしたらいいでしょうか? このプログラムに何か記述を追加すれば良いのか、そのほかの方法があるのか、わかりません。ご回答をお願い致します。 因みに私はプログラムに関しては無知なので、わかりやすくお願い致します。

  • エクセルVBAでPCシャットダウン

    ネットを検索してたら、PCをシャットダウンさせるというコード Set objSystemSet = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}").InstancesOf("Win32_OperatingSystem") For Each objSystem In objSystemSet objSystem.Win32Shutdown 1 Next をみつけたので以下のように試してみました。 Sub TEST() Application.OnTime Now + TimeValue("0:05:00"), "PC_ShutDown" End Sub Sub PC_ShutDown() Set objSystemSet = _ GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}") _ .InstancesOf("Win32_OperatingSystem") For Each objSystem In objSystemSet objSystem.Win32Shutdown 1 Next End Sub ところが実行すると、ログオフし、画面に、「コンピュータの電源を切ることができます」と表示されるのですが、そこでとまってしまいます。 PCの電源ボタンも長押しないときかなくなります。 自動で電源は切れないのでしょうか?

  • WSHからのコマンドプロンプト実行

    お世話になります。 OS:Windows7 Professional SP1 UAC:既定(上から2番目) 上記の条件で、WSHからコマンドプロンプトを管理者権限で立ち上げ、 ファイルをコピーするスクリプトを作成したいのですが・・・ 当方あまり知識が無く困り果ててる次第でございます。 *************************************************************************** Do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7 Set wmi = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set os = wmi.ExecQuery("SELECT *FROM Win32_OperatingSystem") For Each value in os if left(value.Version, 3) < 6.0 then exit do Next Set sha = CreateObject("Shell.Application") sha.ShellExecute "cmd.exe", """" & WScript.ScriptFullName & """ uac", "", "runas" WScript.Quit loop *************************************************************************** 以上のコマンドでUsersからでも管理者権限でプロンプトが立ち上がる所までは確認しています。 このあと、プロンプト上で    "Copy D:\A.txt C:\Windows\System32 /y" を自動的に実行してくれるようなスクリプトにしたいのですが、どう記述すればよいのでしょうか? なるべくユーザーに負担をかけない形で、スクリプト一発で処理できたらと考えていますが・・・ ご指導よろしくお願い致します。

  • リモートPCの情報取得について

    Windows2000から下のVBSを実行しますがうまくデータを取得できません。 取得先のPCもWinodows2000です。.NET Framework 1.1以上です。 ファイヤーウォールの類もありません。 どなたか教えて下さい。 ------------------------------------------------------ strComputer = "192.168.2.●●" Set wbemServices = GetObject("winmgmts:\\" & strComputer) Set wbemObjectSet = wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration") For Each wbemObject In wbemObjectSet WScript.Echo "物理メモリの合計 (kb): " & wbemObject.TotalPhysicalMemory Next

  • vbsによるユーザ情報の取得について

    windows2003のマシンで全ユーザ情報を取得したいです。 具体的にはnet user "ユーザ名" コマンドを実行したいのですが 対象マシンが複数あり、ユーザもたくさんいるのであまり手間をかけることなくbatかvbsで実行したいのですが 構文を教えていただけないでしょうか c:\net user \\xxxx のユーザー アカウント ------------------------------------------------------------------------------- Administrator ASPNET HelpAssistant SUPPORT_388945a0 Guest コマンドは正常に終了しました。

  • VC++ で.bat起動

    また、こちらを使わせていただきます。 VC++で.batファイルを起動しようとしていますが、cmdはあくのですが、.batが起動しません。他の参考にしてますが、なかなかたどり着きません。どなたか、アドバイスお願いいたします。 .bat fileは次のとおりです。 cd\Program Files\Wireshark> tshark -i.2 greater 170 -a duration:2 -w.... tshark -v-r e:\Test\test5.pcap.... VC++は次のとおり void CStartupapplicationView::OnBnClickedButtontest() { //cmdは、ShellExecuteでも、CreateProcessでも開けられますが、 //bat fileの起動がうまくいきません。 HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOWNORMAL); ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW); //.batファイルは、c:Program Files\Wiresharkの下に入っています。//が、.Batは起動しません。 if (ret <= (HINSTANCE)32) AfxMessageBox("can not Shell.",MB_OK); //別の方法 STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; ZeroMemory(&sinfo,sizeof(STARTUPINFO)); ZeroMemory(&pinfo,sizeof(PROCESS_INFORMATION)); sinfo.cb=sizeof (STARTUPINFO); sinfo.dwFlags=STARTF_USESHOWWINDOW; sinfo.wShowWindow=SW_SHOWNORMAL; if(!CreateProcess(NULL,_T("cmd.exe c:\\test2.bat "), // test2.batは、Document and settings/----------- //Startup applicationの下にはいっていますが、起動しません。 NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)); {//起動失敗 } //

専門家に質問してみよう