コマンドプロンプトにログを出力するには?

解決


AC  2005-07-22 20:11:49  No: 91039

始めまして。
バッチファイルを作成し、
VB6で作成したexeを連続実行しています。
そこで、コマンドプロンプト上にログの出力を
行いたいのですが、方法がわかりません。

COMSPECを使用すればできるのでしょうか?
よろしくお願いします。


もげ  2005-07-22 23:25:31  No: 91040

たとえば、こんな感じかと。
http://homepage2.nifty.com/nihon-nouen/programming-stdinout.htm


AC  2005-07-23 02:50:12  No: 91041

ありがとうございます。
実験してみます。


AC  2005-07-23 04:48:06  No: 91042

解決としながらもすいません。

VBSを使用しない
VBのみで出力する
VBのexeと同じコンソール画面に出力する

の3つの条件を満たす方法は無いのでしょうか?


K.J.K.  2005-07-23 20:24:03  No: 91043

Linkerのオプションで、
/SUBSYSTEM:CONSOLE
するとか、EXEにした後で上記に該当する部分を書き換えるとか。
そうすれば、標準入出力がAPI関数を通してですけどそのまま
使えますよね。

ただまぁ、VB6でやるべきことには思えませんが。


Say  2005-07-24 20:06:35  No: 91044

>VBのみで出力する
>VBのexeと同じコンソール画面に出力する
にこだわらないなら、

どっかからDOS版tailでも拾ってきて、
コンソール出力専用DOS窓を開いて、
tail -f ファイル名.txt
とでもしておき、
VBアプリはそのtxtファイルにappend出力すれば簡単でいいかと。

ま、要はVBからはテキストファイル出力し、
それを監視してコンソール出力するソフトを
別途用意するということで。(perlあたりで自作も可)

K.J.K.さんも言われてますが、
技術的興味から実験として趣味でVBにやらせたいというのでないなら、
わざわざVBで標準入出力やるべきではないでしょう。

乗用車で海を渡りたい、と言っているようなものです。
(改造すればできなくはないだろうし、おもしろそうでもあるが、
実用的ではない。海を渡りたかったら船を使え、ということです。)

と言いつつVBでCGI作ったことあったりしますが…(あくまで趣味で)
苦労が多くておもしろいけど実用的ではないですね。
perlやCで作るほうがはるかに楽です。


たくみ  2005-07-26 16:28:25  No: 91045

ちょっと違うかもしれませんが、
でも実用的なのならいいんですよね?

これでどうでしょう。
ここのいちばん最後のくだりを読まれてください。
(このページをcomspecで検索してもいいかも)

# ちなみに私は以前ここで救われました。。。


たくみ  2005-07-26 16:29:45  No: 91046

すみません。肝心なリンクを貼り忘れ。。。

http://www.f3.dion.ne.jp/~element/msaccess/AcTipsGetDosResult.html


たくみ  2005-07-26 16:47:21  No: 91047

何度もどうも。
ご質問である「コマンドプロンプト上にログの出力を行う」
の回答になってないじゃないか?と思い。。(忘れすぎ!)

リンク先の例ではリダイレクトによりファイルを作ってしまう
例なわけですが、どうしても目視で確認すべくエコーが必要なら
「えせDOS窓」みたてのもの、例えば「ただのVBのフォーム」に
「でかいテキストボックス」を置いたものなどを作ってそこに
今リダイレクトされできたテキストファイルを
Open文で1行づつ(改行させて!)先頭からEOFまで読んで
書かせればいいのではと。

もっとも、なぜエコーしないといけないのかは疑問が残るので、
(目視で見れて、でどうするの?)
ログファイルができるだけで要求は満たせない?
逆に言えば、どうも実はファイルにする発想がなかったので
このスレのご質問なのかしら?


ガッ  2005-07-26 17:11:35  No: 91048

コマンドプロントじゃなくて、徒のコンソールだけど…

-ConsoleOut.cls-
Option Explicit

Private Declare Function AllocConsole Lib "kernel32" () As Long
Private Declare Function FreeConsole Lib "kernel32" () As Long
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" ( _
        ByVal hConsoleOutput As Long, _
        lpBuffer As Any, _
        ByVal nNumberOfCharsToWrite As Long, _
        lpNumberOfCharsWritten As Long, _
        lpReserved As Any) As Long
        
Private Const STD_OUTPUT_HANDLE = -11&

Private hOut        As Long

Private Function ssb(ByRef s As String) As Byte()
    '(String->to FromUnicode)->byte()
    ssb = StrConv(s, vbFromUnicode)
End Function

Private Sub Class_Initialize()
    'コンソールを開いて、stdOutを得る
    Call FreeConsole
    Call AllocConsole
    hOut = GetStdHandle(STD_OUTPUT_HANDLE)
End Sub

Private Sub Class_Terminate()
    'コンソールを閉じる
    Call FreeConsole
End Sub

Public Function PrintString(ByVal s As String) As Long
    'コンソールに書き込む
    Dim buf()       As Byte
    Dim i           As Long
    
    If s = "" Then Exit Function
    buf = ssb(s)
    i = UBound(buf) - LBound(buf) + 1
    WriteConsole hOut, buf(LBound(buf)), i, PrintString, ByVal 0
End Function

※動くかな…?
  というより、目的に適ってるかな??
  コマンドプロントを起動して、何かアプリを走らせた状態の標準入出力は、
  …昔サンプルをいただいたのですが、未だに理解が遠い状態(ぇ


AC  2005-07-26 23:48:53  No: 91049

色々と調べていただいてありがとうございます。

ご教授してくださった内容を試してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加