マンガでよめる痔のこと・薬のこと

VBからBATファイルを起動して戻り値(エラーコード)を
もらうにはどうすれば良いのでしょうか?
WshShellという関数を使用することは、何となく分かるのですが
宜しければサンプルを教えていただけないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>WScript.CreateObjectの


>ところで"オブジェクトが必要です"となってしまいます。

VBのときは、CreateObjectですね。
    • good
    • 1
この回答へのお礼

おっしゃるとりでした。うまくいきました。
この度は有難うございました。

お礼日時:2005/05/20 19:49
    • good
    • 0
この回答へのお礼

早速の回答有難う御座います。
色々試行錯誤して以下のように書いてみましたが、WScript.CreateObjectの
ところで"オブジェクトが必要です"となってしまいます。何か参照設定に漏れが
あるのでしょうか?宜しくお願いします。

Private Sub Command1_Click()
Dim Fs As New FileSystemObject
Dim ws As WshShell
Dim we As WshExec
Dim tx As TextStream
Dim ERR_FLG As String

Set ws = New WshShell
Set we = ws.Exec("test1.bat > test1.log")
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
Set tx = Fs.OpenTextFile("test1.log", 1)

Do Until tx.AtEndOfStream
tLine = tx.ReadLine
If InStr(tLine, "ERRORLEVEL") <> 0 Then
ERR_FLG = Mid(tLine, 11, 1)
End If
Loop
  
  msgbox ERR_FLG
End Sub

test1.bat
@echo off
バックアップ処理
IF NOT %ERRORLEVEL% == 0 GOTO ERROR
echo 正常終了しました。
GOTO END
:ERROR
ECHO バックアップ処理がエラーを返して終了しました。
:END
ECHO ERRORLEVEL %ERRORLEVEL%

お礼日時:2005/05/20 16:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QShell関数からバッチファイルを起動後に、バッチファイルが終了するまで待ちたい。

はじめまして。
掲題の通り、VB.netからshell関数を用いてバッチファイルを起動します。
その後、そのバッチファイルが終了してログファイルの出力を完了した後に、
ファイルを開いて確認したいのです。
thread.sleepなどで大体このくらいかなという時間を待ってみる、
などのやり方しか今は思いつかないのですが、
何か明確にバッチファイルの終了を受け取れる方法は無いものでしょうか。

どなたかご存知の方がいらっしゃいましたらご教授ください。

Aベストアンサー

Shell関数より Processクラスで実行したほうが簡単に待てますよ

Dim oPro as Process
oPro = Process.Start("..\..\a.bat")
oPro.WaitForExit()
MessageBox.Show("Hello")

といった具合です

Qバッチへ値を返す

バッチファイルからVB作成のEXEファイルを起動させて、EXEの結果をバッチファイルに出力するにはどのような処理をすればよいでしょうか?

Aベストアンサー

#2です。
VB6でしたね

ただ単に OS側に終了コードを返すだけなら

以下のHPの情報が役に立つのでは

■[VB-TIPS] VBでプログラム終了コードを返すには
  → http://d.hatena.ne.jp/chaichanPaPa/20071104/1194147591
  
  
◆プログラムの終了コードを取得する
  → http://jeanne.wankuma.com/tips/vb6/process/exitcode.html
  
#2 の方法は何か処理を行った値を渡したいときに有効です。
VB.NET 2005 で作成しましたが VB6 のソースに書き換えれば同じことができるはずです。 #2の方法で 終了コードを結果出力するように
してあげれば OSに結果コードを渡したのと同じ動作をするバッチファイルも作れます。 

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QVBアプリケーションで終了コードを指定する方法

VB6でアプリケーションを作成しますが、
親プロセスに終了コードを返して、Errorの有無を
認識させたいと思います。
VB6で可能でしょうか??
可能なら、どのような方法があるでしょう??
よろしくお願い申します。

Aベストアンサー

VB6の機能だけでは無理なように思います

WinAPIのExitProcessを使えば出来そうです
この場合 Sub Main経由でやったほうがいいかもしれません

たとえば 標準モジュールに
Public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

Public bFlag As Boolean

Sub Main()
  Form1.Show vbModal
  If bFlag Then
    ExitProcess 1
  End If
  ExitProcess 2
End Sub
といった具合のコードが記述してあれば bFlagがTrueならば 1を返し
それ以外なら 2を返すといったことが可能です

バッチファイルから呼び出すならば
Text.exe
if errorlevel == 3 goto L3
if errorlevel == 2 goto L2
echo "1"
goto exit
:L2
echo "2"
goto exit
:L3
echo "3"
:exit
といったバッチで判定できるでしょう

VB6の機能だけでは無理なように思います

WinAPIのExitProcessを使えば出来そうです
この場合 Sub Main経由でやったほうがいいかもしれません

たとえば 標準モジュールに
Public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

Public bFlag As Boolean

Sub Main()
  Form1.Show vbModal
  If bFlag Then
    ExitProcess 1
  End If
  ExitProcess 2
End Sub
といった具合のコードが記述してあれば bFlagがTrueならば 1を返し
それ以外なら 2を返すといっ...続きを読む

QVBAで外部プログラムを非表示で実行するには

VBAとVBScriptを混同しているのかもしれませんがよく分からないので教えてください。

Excel2010のVBAから、外部プログラム(test.exe)をコマンドプロンプトを非表示の状態で実行して、外部プログラムの実行が終了するのを待ってから、次の処理をさせたいのですが、test1のプログラムでは(A)の部分でエラーになってしまいます。また、test2のプログラムでは正しく実行されるのですがコマンドプロンプトのウインドウを非表示にする方法がよく分かりません。

test1のプログラムでエラーをでなくする方法、または、test2のプログラムでコマンドプロンプトのウインドウを非表示にする方法がありましたら教えてください。

-------------------------------------------------------
Sub test1()
 Dim ws As Object
 Dim we As Object
 Dim command As String
 command = "C:\test.exe"
 Set ws = CreateObject("WScript.Shell")
 Set we = ws.Run("%ComSpec% /c " & command, 0, False) '<===(A)
 Set we = Nothing
 Set ws = Nothing
End Sub
-------------------------------------------------------
Sub test2()
 Dim ws As Object
 Dim we As Object
 Dim command As String
 command = "C:\test.exe"
 Set ws = CreateObject("WScript.Shell")
 Set we = ws.exec("%ComSpec% /c " & command)
 Do Until we.Status
  DoEvents
 Loop
 Set we = Nothing
 Set ws = Nothing
End Sub
-------------------------------------------------------

VBAとVBScriptを混同しているのかもしれませんがよく分からないので教えてください。

Excel2010のVBAから、外部プログラム(test.exe)をコマンドプロンプトを非表示の状態で実行して、外部プログラムの実行が終了するのを待ってから、次の処理をさせたいのですが、test1のプログラムでは(A)の部分でエラーになってしまいます。また、test2のプログラムでは正しく実行されるのですがコマンドプロンプトのウインドウを非表示にする方法がよく分かりません。

test1のプログラムでエラーをでなくする方法、または、te...続きを読む

Aベストアンサー

Runメソッドを何処で調べましたか?
詳しくはこちらを見てください。
http://msdn.microsoft.com/ja-jp/library/cc364421.aspx

先ず、Aで失敗する理由ですが、Runメソッドの戻り値は何型ですか?
説明を見れば分かると思いますが、整数です。オブジェクトでは
ありません。従って、戻り値の型が違うし、Set文を使うのもオカシイ

次に、プログラムの終了を待つなら、Runメソッドの第3引数は
省略するか、Trueを指定すべきです。

test2のExecメソッドはオブジェクトを返しますが、この中には
標準入出力やエラー出力用の出し入れ口があり、人に代わって
データを送り込んだり、出力結果を見て、処理を変更するなどを
行う場合に使いますので、今回の仕様では使いません。
尚、DoEventsでグルグル回る処理は絶対にすべきではありません。
必ずSleepを入れるべきだし、DoEventsの使用そのものを避ける
べきだからです。この文がどのような効果をもたらすかを理解しており、
それを制御できるだけの技術があれば別ですが・・・

Runメソッドを何処で調べましたか?
詳しくはこちらを見てください。
http://msdn.microsoft.com/ja-jp/library/cc364421.aspx

先ず、Aで失敗する理由ですが、Runメソッドの戻り値は何型ですか?
説明を見れば分かると思いますが、整数です。オブジェクトでは
ありません。従って、戻り値の型が違うし、Set文を使うのもオカシイ

次に、プログラムの終了を待つなら、Runメソッドの第3引数は
省略するか、Trueを指定すべきです。

test2のExecメソッドはオブジェクトを返しますが、この中には
標準入出力やエラー...続きを読む

QVBAでコマンドプロンプトの結果を変数に代入

コマンドラインソフトのffmpegを使って、動画の再生時間などを取得したいのですが
VBAでコマンドプロンプトの結果を変数に代入する方法について教えてください。

"D:\xxxx\ffmpeg\bin\ffmpeg" -i "d:\xxxx\aaff.mp4" 2>&1 | grep Duration

これをコマンドプロンプトで実行すると
d:\xxxx\aaff.mp4の再生時間などがコマンドライン上に表示されます。
これを変数に代入するために、

http://officetanaka.net/excel/vba/tips/tips27.htm

このページを参考にして

Sub Sample1()
Dim WSH, wExec, sCmd As String, Result As String
Set WSH = CreateObject("WScript.Shell") ''(1)
sCmd = """D:\xxxx\ffmpeg\bin\ffmpeg"" -i ""d:\xxxx\aaff.mp4"" 2>&1 | grep Duration"
Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) ''(3)
Do While wExec.Status = 0 ''(4)
DoEvents
Loop
Result = wExec.StdOut.ReadAll ''(5)
MsgBox Result
Set wExec = Nothing
Set WSH = Nothing
End Sub



を実行しました。
しかしResultには何の文字列も代入されませんでした。

恐らく、このページのタイトルにもあるように「MS-DOSコマンドの標準出力を取得する」

とあるので、標準出力しか取得できないのではないかと思います。


それでは一般的なコマンドラインソフトの実行結果を変数に代入するにはどうしたら良いでしょうか?

コマンドラインソフトのffmpegを使って、動画の再生時間などを取得したいのですが
VBAでコマンドプロンプトの結果を変数に代入する方法について教えてください。

"D:\xxxx\ffmpeg\bin\ffmpeg" -i "d:\xxxx\aaff.mp4" 2>&1 | grep Duration

これをコマンドプロンプトで実行すると
d:\xxxx\aaff.mp4の再生時間などがコマンドライン上に表示されます。
これを変数に代入するために、

http://officetanaka.net/excel/vba/tips/tips27.htm

このページを参考にして

Sub Sample1()
Dim WSH, wExec, sCmd As Str...続きを読む

Aベストアンサー

>それでは一般的なコマンドラインソフトの実行結果を変数に代入するにはどうしたら良いでしょうか?

一般的なコマンドラインソフトの実行結果は、標準出力に出るので、プログラムに間違いは無いと思います。

grepをフルパスにしてみるとか。

QコマンドプロンプトのERRORLEVELを取得したい

VBからコマンドプロンプトを呼び出し、
他のEXEを実行させ、
そのERRORLEVELを取得したいのですが、
どのようにすればよいでしょうか?

Aベストアンサー

パイプを使う方法あり
でもVBだと、落ちやすい
ファイルから読み込むのがいい

Qバッチファイルでエクセルのマクロを動かしたい

最近になってバッチファイルを知りました。バッチファイルを使ってエクセルファイルの中に書かれたマクロを動かしたいと思っています。
過去ログの検索をし、マクロが書かれたエクセルを起動させるところまではわかりました。
しかしその先がわかりません。わからない内容は次の二つです。
1)エクセル起動時マクロを有効にするかどうか聞いてきます。自動的に有効で起動させるにはどうしたらいいでしょうか。
2)Macro1という名前のものが001.xlsの中に既に作ってあったとして、これを作動させるにはどのようにしたらいいのでしょうか。
環境はwin xp sp2 office2000です。
過去ログを参考にし、下記記述で001.xlsを開くところまではわかりました。この後をどうすればいいか、よろしくお教えください。
"C:\Program Files\Microsoft Office\Office\excel.exe" "c:\My Documents\001.xls"

Aベストアンサー

こんにちは。

Perl 自体は、また別というか、Wscript.Run で呼び出してもよいと思いますが、
WScript でも、Perl の複雑な処理にはかないませんが、正規表現も持っていますから、多少は似たようなマネが出来ます。

バッチプログラムと違うのは、まず、フォルダを探すことが可能だということと、フォルダを選択する、ダイアログが使えるということです。

個別のファイルのファイルの移動なら、

Const myPATH ="C:\My Documents\

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile =objFS.GetFile(myPATH & "Test.txt")
objFile.Move "C:\"

個別のファイルのファイルの削除なら、

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile =objFS.GetFile(myPATH & "Test.txt")
objFile.Delete

----------------------------------------------
ワイルドカードも使うようでしたら、
Const myPATH ="C:\My Documents\


Set objFS = CreateObject("Scripting.FileSystemObject")
objFS.MoveFile myPATH &"*.txt", "C:\"

ですし、ファイルの削除なら、

Set objFS = CreateObject("Scripting.FileSystemObject")
objFS.DeleteFile myPATH &"*.txt"

ということになります。

---------------------------------------------
なお、余談ですがVBAの技術は、今はもう停滞したままですが、総じて、テキスト・スクリプト側は、日進月歩、Win XP になってからは、1年ごとに、まるで違う技術が導入されているのです。歯が立たないかもしれませんが、どんな風になっているかは、知っておいたほうがよいかもしれません。昔は、コンパイラーを使った、実行ファイルしたが、今は、テキスト・スクリプトで、ツールを出しています。それは、Office 2007 も同じですね。そして、今は、スクリプトで、.Net FrameWork まで使ってしまおうというのだから、時代は変わっているのです。(知っている人には、間が抜けた発言ですが。)

参考サイト:
ヘイ! スクリプティング ガイ
http://www.microsoft.com/japan/technet/scriptcenter/learnit.mspx

こんにちは。

Perl 自体は、また別というか、Wscript.Run で呼び出してもよいと思いますが、
WScript でも、Perl の複雑な処理にはかないませんが、正規表現も持っていますから、多少は似たようなマネが出来ます。

バッチプログラムと違うのは、まず、フォルダを探すことが可能だということと、フォルダを選択する、ダイアログが使えるということです。

個別のファイルのファイルの移動なら、

Const myPATH ="C:\My Documents\

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objF...続きを読む

QコマンドプロンプトのERRORLEVELについて!

コマンドプロンプトの記述で、ERRORLEVELというのがありますが
そのERRORLEVELが、0の場合は正常終了と考えていいのでしょうか?

Aベストアンサー

>if not ERRORLEVEL 1 goto aaa
>教えていただいた上記記述なんですが、
>1じゃないということは、2~255も含まれるのではないのでしょうか?
>素朴な疑問ですいません。

if文の文法については、if /? で調べてください。

if ERRORLEVEL 1 goto aaa は、ERRORLEVEL が1以上の時にgoto aaaするという意味です。ということを#4の人が書いてるのですが・・・
従って、その否定である、
if not ERRORLEVEL 1 goto aaa は、ERRORLEVEL が1未満つまり0のときにgoto aaaします(負になることはないので)。

QバッチファイルからVBAに引数を渡したい

お世話になります。

a.batというバッチファイルがあります。
このファイルを起動させた時にABC.xlsというEXCELが起動するようにしたいのですが、その際にバッチファイル側から"1303"という文字列をabc.xlsに引数として渡したいのです。

EXCEL側ではauto_open(a)で待ち受けて、このaに"1303"が入ってmsgで"1303"と表示させたいのですが、引数は省略出来ません、というエラーが出てしまいます。

どなたかやり方をご教授いただけませんでしょうか?よろしくお願い致します。
環境 WindowsXP SP3 Excel2003

==============================
バッチファイル側
==============================
@echo off

echo バッチファイルを実行します。

ABC.xls "1303"

echo 終了しました。

==============================
EXCEL VBA側
==============================
Sub auto_open(a As String)

Msg a

end sub

お世話になります。

a.batというバッチファイルがあります。
このファイルを起動させた時にABC.xlsというEXCELが起動するようにしたいのですが、その際にバッチファイル側から"1303"という文字列をabc.xlsに引数として渡したいのです。

EXCEL側ではauto_open(a)で待ち受けて、このaに"1303"が入ってmsgで"1303"と表示させたいのですが、引数は省略出来ません、というエラーが出てしまいます。

どなたかやり方をご教授いただけませんでしょうか?よろしくお願い致します。
環境 WindowsXP SP3 Excel2003

===...続きを読む

Aベストアンサー

Excel には起動時に渡せるオプションがありませんね。。
Batでは
Echo 1303 > d:\後で消す.txt
Explorer.exe d:\data\ABC.xls
rem ↑横着してます。"C:\・・・\excel.exe " "d:\data\ABC.xls" が王道です

Excelでは
Sub auto_open()
Dim ff As Integer
Dim buf As Variant
If Dir("d:\後で消す.txt") = "" Then
MsgBox "何もなし"
Exit Sub
Else
ff = FreeFile
Open "d:\後で消す.txt" For Input As ff
Input #ff, buf
MsgBox buf
Close ff
Kill "d:\後で消す.txt"
End If
End Sub

とか?
一時的に"d:\後で消す.txt"に書き込んで
Excelで読み込んだらKillで消してます。

1303 だけでなく任意の値なら
Echo %1 > d:\後で消す.txt
Explorer.exe d:\data\123\ABC.xls
というBatファイルを Test.bat 名で保存して
コマンドプロンプトから
・・・・\test.bat 999
などと・・・ですかね。

Excel には起動時に渡せるオプションがありませんね。。
Batでは
Echo 1303 > d:\後で消す.txt
Explorer.exe d:\data\ABC.xls
rem ↑横着してます。"C:\・・・\excel.exe " "d:\data\ABC.xls" が王道です

Excelでは
Sub auto_open()
Dim ff As Integer
Dim buf As Variant
If Dir("d:\後で消す.txt") = "" Then
MsgBox "何もなし"
Exit Sub
Else
ff = FreeFile
Open "d:\後で消す.txt" For Input As ff
Input #ff, buf
MsgBox buf
Close ff
Kill "d:\後で消す.txt"
End If
End Sub

とか?
一時的に"d:\後...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング