人に聞けない痔の悩み、これでスッキリ >>

コマンドラインソフトの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コマンドの標準出力を取得する」

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


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

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

A 回答 (2件)

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



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

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

この回答への補足

http://tunemicky.blogspot.jp/2012/03/cmdexe-c.html

このページを見るとパス名にスペースを含む場合
パス名だけでなく全体を""で囲む必要があることがわかりました。


cmd.exe /k ""D:\Program Files2\ffmpeg\bin\ffmpeg" -i "d:\Documents and Settings\xxxxx.mp3" 2>&1 | grep Duration"

とりあえずbatファイル上で動くか試してみたところ
上記でうまくいくことが分かりました。


しかしこれをVBAで実行してもやはりうまくいきません。

どうすれば良いでしょうか?
 

補足日時:2015/01/22 13:17
    • good
    • 1
この回答へのお礼

ありがとうございます。
ご回答が理解できていないのですが
grepをフルパスというのは何のパスを入れるのですか?

お礼日時:2015/01/22 12:06

PCの電源が入らないので未テストですが。



> sCmd = """D:\xxxx\ffmpeg\bin\ffmpeg"" -i ""d:\xxxx\aaff.mp4"" 2>&1 | grep Duration"
grepの結果をリダイレクトしてないのでは?

sCmd = """D:\xxxx\ffmpeg\bin\ffmpeg"" -i ""d:\xxxx\aaff.mp4"" 2>&1 | grep Duration > foovar.txt
でどうなりますか?

この回答への補足

原因が分かりました。
ダブルクオーテーションマークが問題のようです
sCmd = "D:\ffmpeg -i d:\aaff.mp4 2>&1 | grep Duration"

全てのファイルをドライブ上において""""を抜いて実行するとうまくいきます。

それでは
""""有りで実行するにはどうしたら良いですか?
 

補足日時:2015/01/22 12:44
    • good
    • 0
この回答へのお礼

ありがとうございます。
最後に"を付けて
sCmd = """D:\xxxx\ffmpeg\bin\ffmpeg"" -i ""d:\xxxx\aaff.mp4"" 2>&1 | grep Duration > foovar.txt"

を実行してみました、しかうまくいきませんでした。
そもそも
"D:\xxxx\ffmpeg\bin\ffmpeg" -i "d:\xxxx\aaff.mp4" 2>&1 | grep Duration > foovar.txt

をコマンドライン上で実行しても何も出力されないのですが


foovar.txtというのはフルパスで指定しなくて良いのでしょうか?

お礼日時:2015/01/22 12:05

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

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

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

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

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

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メソッドはオブジェクトを返しますが、この中には
標準入出力やエラー...続きを読む

QExcelVBAでDOSコマンドの標準出力をリアルタイムでフォームへ出力するには

いつもお世話になります。

タイトルにある通りです。
VBAより実行したDOSコマンドの実行結果を、tailコマンドのように、フォーム(テキスト部品など)に出力させたいと考えています。

一度実行結果をファイルへ保存してそれをフォームへ出力させる、というのではなく、あくまでリアルタイムで表示する、ということは可能でしょうか?

よろしくお願いします。

Aベストアンサー

回答番号:No.1の続きになりますが(こんなレスの付け方でいいのか?)

1. 標準入力から読み込んだ文字列を指定WindowへSendMessageで送信するプロセスを作成。
2. VBAのユーザフォームをサブクラス化してハンドラ作成。(受信文字列をテキストボックスへ追加)
3. VBAから実行するコマンド文字列を、送信プロセスにリダイレクトするように作成して実行。

で、できるような気がしますが、どこがわかりませんか?
回答3にもあるように、
>VBAでやる範疇ではないでしょう。
が全てのような。

QVBからBATファイルを起動して戻り値の取得方法

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

Aベストアンサー

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

VBのときは、CreateObjectですね。

QExcelのセルの内容をコマンドプロンプトで実行

Excel VBA初心者です。
Excelのセルに記入されている文字列をコマンドプロンプトで実行する方法を教えて下さい。

具体的には、

A1 → d:
A2 → cd hogehoge
A3 → dir

とセルにそれぞれ記入されていたとして、フォームから作成したボタンを押下すると
A1~A3が順番にコマンドプロンプトで実行(貼り付け)されるマクロの作り方が知りたいです。

ロジックは以下のようにしたいと考えています。

セルA1に値 →ない→ 「値がありません」というエラーのポップアップか何かを表示。
↓ある
セルA1に記入された文字列をコマンドプロンプトで実行

セルA2に値 →ない→exit
↓ある
セルA2に記入された文字列をコマンドプロンプトで実行

セルA3に値 →ない→exit
↓ある
以下ループ

わかりにくいかもしれませんが、よろしくお願い致します。

Aベストアンサー

目的が分からないのですが、思いつきで作成してみました。
セルの情報からバッチファイルを生成して実行するコードです。
XPSP3、XL2000で試しています。ご参考まで。
Sub test()
Dim targetRange As Range
Dim FSO As Object
Dim i As Long
Dim myTextFile As Object
Dim batFilePath As String

Set FSO = CreateObject("Scripting.FileSystemObject")
’バッチファイルをテンポラリフォルダーに作成して実行します
batFilePath = FSO.GetSpecialFolder(2) & "\temp.bat"
Set myTextFile = FSO.CreateTextFile(batFilePath)
With ActiveSheet
Set targetRange = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp))
End With
With myTextFile
For i = 1 To targetRange.Cells.Count
If i = targetRange.Cells.Count Then
'コマンドプロンプトを開いたままにする
.writeline "cmd /k " & targetRange.Cells(i)
Else
.writeline targetRange.Cells(i)
End If
Next i
.Close
End With
Set FSO = Nothing
CreateObject("WScript.Shell").Run "CMD.EXE /C " & batFilePath, , True
End Sub

おまけで、DOSコマンドの実行結果をVBAで取得したい時は、下記が参考になると思います。
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsGetDosResult.html

目的が分からないのですが、思いつきで作成してみました。
セルの情報からバッチファイルを生成して実行するコードです。
XPSP3、XL2000で試しています。ご参考まで。
Sub test()
Dim targetRange As Range
Dim FSO As Object
Dim i As Long
Dim myTextFile As Object
Dim batFilePath As String

Set FSO = CreateObject("Scripting.FileSystemObject")
’バッチファイルをテンポラリフォルダーに作成して実行します
batFilePath = FSO.GetSpecialFolder(2) & "\temp.bat"
Set myTextFile = FSO...続きを読む

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

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

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

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

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

Aベストアンサー

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

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

といった具合です

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html


人気Q&Aランキング