![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
Excel VBA コマンドライン(MS-DOS)でウィンドウを閉じずに最終行(文字)まで取得する。
コマンドライン上で実行した結果を受け取って入力待ち状態のところまで読み込み、そのコマンドラインウィンドウ上で次のコマンドを入力したい。
Wscript.Exec.Stdout で標準出力を取得するものの、ウィンドウが開きっぱなしなので、EOSにならないため、Do~Loopで取得すると、最終行を取得する又は最後の文字+1文字を取得する時に、続きを待つためにフリーズする。
何か良い手はないでしょうか?
(諸般の事情については後述します)
sample - - - - - - - - - - - - - - - - - -
Dim wsh As Object
Dim wExec As Object
Dim buf as string
Set wsh = CreateObject("Wscript.Shell")
Set wExec = wsh.exec("%ComSpec% /c CMD")
wExec.stdin.Write "dir" & vbCrLf
Do Until wExec.stdout.AtEndOfStream
buf = buf & wExec.stdout.Read(1)
Loop
- - - - - - - - - - - - - - - - - -
dir コマンド実行後、カレントフォルダ>までは読み込むが、次がないので読み込み状態で止まる。
■試したこと
CMD実行時、リダイレクトで標準出力結果をtxtに出力する。
txtの容量をモニターして、任意の時間(1秒未満)、更新がなければ次の処理判定をする
⇒dir c:\ /s を実行したら、対象が多すぎたのかtxtの容量が途中で増えなくなった。
(ウィンドウを閉じたら更新された)
今のところ、一番近い動作ができそうなのはこの方法ですが、
上記から、txt ファイルの更新が完全なリアルタイムではないようなので、できるだけ標準出力を直接読み取りたく、次点としています。
- - - - - - - - - - - - - - - - - -
Set wExec = wsh.exec("%ComSpec% /c CMD > C:\log.txt")
wExec.stdin.Write "dir c:\ /s" & vbCrLf
for n = 1 to 1000
debug.print FileLen("C:\log.txt")
sleep 10
DoEvents
next n
~~
- - - - - - - - - - - - - - - - - -
■実際にやりたいこと(事情)
PLINK (telnet) コマンドでアクセスした先とのやり取りを自動化したい。
コマンドによっては、環境によって、その後実行するコマンドが可変になるため、
入力待ち状態で、それまで出力された情報を読み取って、処理を決定したい。
中断すると、コマンド入力が始めからになるので、ウィンドウはひらきっぱなしにしたい。
サーバー側の挙動は変えられない。
追加のフリーソフトなどの導入はNG。
以上、よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
> ASTERACEAE は適当な文字列ですよね。
はい。ここでは応答が定数のコマンドを投入して楽をしていますが、1文字ずつ読み込みながら読み込みすぎてブロックされてしまう前に先行のコマンドの応答を解析して次のコマンドを投入していくことになると思います。
ブロックされないことを確認してから読みこむには CreateProcess() に CreatePipe() を接続して PeekNamedPipe() します。
ご回答ありがとうございます。
>ブロックされないことを確認してから読みこむには CreateProcess() に CreatePipe() を接続して PeekNamedPipe() します。
これは・・・すみません、私の実力では全くついていけないないようですね。
勉強します・・・が、使い方について、参考にできるようなページはあるでしょうか?
とっかかりすらうまくつかめません・・・
No.5
- 回答日時:
VBA + CreateProcess + CreatePipe + PeekNamedPipe を検索すると見つかります:
https://qiita.com/shela/items/4340c5f234911db7cf9c これらは Win32 API です。Win32 API のリファレンスは C/C++ で解説しているので、これらを正しく使うには C/C++ と VBA を相互に翻訳できる必要があります。ブロックされない読みこみが本質的に必要なのでしょうか? なぜでしょうか。返答が遅くなり申し訳ありません。
ご紹介いただいたPageを読み込んでみます。
事情について、良い例が出せないのですが、
質問文末尾内容 に補足するなら
すでに作りこまれて変更できないシステムに対して、
コマンド実行後、いろいろな入力を求められるのですが、
直前の表示が不定なので、標準出力文字で判定ができないといったところでしょうか。
dir /p だと、末尾まで、何度 Enter Key を押せばいいかわからない・・・
のような。(実際に vba から dir /p しても /p は無視されるみたいなので良い例ではないですが。)
No.3
- 回答日時:
入力待ちになる前に次のコマンドを投入します
Set wExec = wsh.exec("%ComSpec%") ' cmd.exe
wExec.stdin.Writeline "dir"
wExec.stdin.Writeline "echo ASTERACEAE"
s = 1
Do Until wExec.stdout.AtEndOfStream
buf = wExec.stdout.Readline
Debug.Print buf
If buf Like "ASTERACEAE*" Then
Select Case s
Case 1
wExec.stdin.Writeline "cd .."
wExec.stdin.Writeline "echo ASTERACEAE"
s = 2
Case 2
wExec.stdin.Writeline "exit"
s = 3
End Select
End If
Loop
なるほど!
ASTERACEAE は適当な文字列ですよね。
直前のコマンドが終了したら、echoで固定の値が出力されるようにして、それを取ると。
ありがとうございます。
質問文、sample コードに対しては問題ありませんので、私が悪いのですが、
「任意の入力待ちが発生するコマンドの実行中」で実行できるような手段はあるでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトが実行中か...
-
バッチファイルでキー操作を行う。
-
ルーターにつながっている全て...
-
デフォルトのショートカットキ...
-
system関数でのシェル起動について
-
別のユーザーフォームのコマン...
-
シェルスクリプト
-
RTX1100の削除コマンド
-
ttlで戻り値を取得する方法
-
文字の点滅はどうやるのですか?
-
ローマ字入力で「トゥ」を入力...
-
チケット何回もエラーは高額請求?
-
「未使用」と「不使用」ってど...
-
このような迷惑メールが一日に...
-
すべてのシートを選択してエク...
-
excelで小数点0を表示させる方法
-
自動改札のエラーって…
-
西暦の2桁表記に使うアポスト...
-
至急お願いします!! Wordで、...
-
iMacキーボードの入力 小文字の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイルでキー操作を行う。
-
コマンドプロンプトが実行中か...
-
コマンドプロンプトで表示が多...
-
ttlで戻り値を取得する方法
-
VBユーザーフォームで時間入力
-
Tera Term Proに関する質問です。
-
別のユーザーフォームのコマン...
-
TEXの表の位置が・・・
-
RTX1100の削除コマンド
-
コンボボックス(最終行取得)
-
コマンドキーがないんですけど...
-
コマンドプロンプトですべてのU...
-
ルーターにつながっている全て...
-
文字の点滅はどうやるのですか?
-
EEPROMのデータの初期化について
-
シリアル通信でコマンドを送信...
-
jupyter notebookが開けません!
-
makeコマンドのエラー
-
アンドロイドでも、robocopyは...
-
HEXから元に戻すには
おすすめ情報