2017-03-28 4 views
1

私はdosコマンドを使ってexeファイルを開くMatlabスクリプトを持っています。このexeは、ユーザーの入力を待っています。このプロジェクトでは、私はスクリプトと動的にするためにすべてを必要とするので、matlabはスクリプトを実行し続け、実行中のexeに何を入力するかを動的に決定してから入力することができなければなりません。Matlab入力を特定のDOS cmd入力にルーティングする方法は?

これまでは、exeをバックグラウンドで実行させて、dos('test.exe &')を使用してMATLABスクリプトを続行させることができましたが、MATLABを実行して実行中のEXEに入力を送ることはできません。私はバッチファイルを試してみましたが、私はまだ同じ問題に遭遇しています。これは、cmd行のexe実行がユーザの入力を待っているときに、cmd行への入力の送信を自動化する方法ですか?

matlabの標準出力を特定の、すでに開いているcmdのインスタンスに再ルーティングする必要があると私は推測しますが、これを行う方法はわからず、何も見つかりませんでしたインターネット上ではどんな洞察力も大変ありがとうと思います。

+0

起動引数として必要なデータを渡すことはできませんか? – m7913d

+0

いいえ開始引数として必要なデータだけを渡すことはできません。まず第一に、それらは起動引数ではなく、exeによって要求されたユーザー入力に対する応答です。第二に、入力は、最初のexeが実行された後、matlabスクリプトによって動的に生成されるので、入力はまだ分かりません – darlingtonia

答えて

1

方法があります。それは単にエレガントではありません。

&でプログラムを呼び出すと、そのウィンドウはフォアグラウンドで表示され、フォーカスは(少なくとも自分のシステムでは)発生しています。だから、java.awt.Robotクラスを使ってMatlabからキーボードイベントを送ることができます。

文字からキープレスへの変換を自動化する必要がある場合は、おそらく大きなswitchステートメントalong these linesが必要です。次の例では、イベントを手動で定義していますが、これは小さな入力に対してのみ実用的です。ここで

robot = java.awt.Robot; 
dos('copy con &'); % open MS-DOS Window that will just echo the input text 
pause(1) % allow some time for the external program to start up 
robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 
    robot.keyPress(java.awt.event.KeyEvent.VK_H); 
    robot.keyRelease(java.awt.event.KeyEvent.VK_H); 
robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
robot.keyPress(java.awt.event.KeyEvent.VK_E); 
robot.keyRelease(java.awt.event.KeyEvent.VK_E); 
robot.keyPress(java.awt.event.KeyEvent.VK_L); 
robot.keyRelease(java.awt.event.KeyEvent.VK_L); 
robot.keyPress(java.awt.event.KeyEvent.VK_L); 
robot.keyRelease(java.awt.event.KeyEvent.VK_L); 
robot.keyPress(java.awt.event.KeyEvent.VK_O); 
robot.keyRelease(java.awt.event.KeyEvent.VK_O); 
robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 
    robot.keyPress(java.awt.event.KeyEvent.VK_1); 
    robot.keyRelease(java.awt.event.KeyEvent.VK_1); 
robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
robot.keyPress(java.awt.event.KeyEvent.VK_ENTER); 
robot.keyRelease(java.awt.event.KeyEvent.VK_ENTER); 

は実行例です:

enter image description here

+0

Nice!しかし、あなたは、外部プログラムがすぐに入力を必要とすると仮定します。入力が「無作為に」求められたらどうなりますか? – Ratbert

+0

@Ratbert休止時間があらかじめわかっている場合、簡単にプログラムすることができます。そうでない場合は、他の方法がどのように機能するのかわかりません。 –

+0

ワウハハ、これはひどいですが、うまくいくと思います!このためにありがとう、私はそれを実装するときにどのようになるのかを知らせますが、今は私の問題を解決するかもしれないと思います – darlingtonia

0

残念ながら、あなたが説明していることを行う方法はありません。

外部プログラムが一時停止し入力を待っているという事実は深刻​​な課題です.Matlabの場合、バックグラウンドで実行されているプログラムがあります。このプログラムが待機中であることを「知る」方法はありません与えられた瞬間に入力されます。

次に、別の問題は、実行中のスレッドにバックグラウンドで送信するコマンドを送信する「Matlabish」方法がないことです。 編集 Luisが提案した解決策は醜いですが、これには効果があります。

外部プログラムを変更することができれば、TCP/IPのような入力トランスファー用の別のプロトコルを定義することで、この問題を確実に回避できます。しかし、それは一般的な答えではないし、私はあなたがそのような可能性を持っていないと思う。

あなたが本当に必死なら、これにはSikuliを使用できます。

0

ルイスMendoによって素晴らしい説明のおかげで、私はすぐに一緒に文字列の入力を受け取り、適切なロボットコマンドを出力する関数を入れています。わたしにはできる!

function typeStringOut(robot,text) 

keyMatch = {}; 
keyMatch(1,:) = {'`','-','=',',','.','/',';','[',']','\'}; 
keyMatch(2,:) = {'~','_','+','<','>','?',':','{','}','|'}; 
keyMatch(3,:) = {'BACK_QUOTE','MINUS','EQUALS','COMMA','PERIOD','SLASH','SEMICOLON','OPEN_BRACKET','CLOSE_BRACKET','BACK_SLASH'}; 
numKeyMatch = {}; 
numKeyMatch(1,:) = {'1','2','3','4','5','6','7','8','9','0'}; 
numKeyMatch(2,:) = {'!','@','#','$','%','^','&','*','(',')'}; 

for i=1:length(text) 
    if isstrprop(text(i),'alpha') 
     if isstrprop(text(i),'upper') 
      robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 
     end 
     eval(['robot.keyPress(java.awt.event.KeyEvent.VK_',upper(text(i)),');']); 
     if isstrprop(text(i),'upper') 
      robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
     end 
    elseif isstrprop(text(i),'digit') 
     eval(['robot.keyPress(java.awt.event.KeyEvent.VK_',text(i),');']); 
    elseif isstrprop(text(i),'wspace')&&strcmp(text(i),' ') 
     eval('robot.keyPress(java.awt.event.KeyEvent.VK_SPACE);'); 
    elseif isstrprop(text(i),'punct')||isstrprop(text(i),'graphic') 
     switch text(i) 
      case {'`','-','=',',','.','/',';','[',']','\'} 
       matchIdx = strcmp(keyMatch(1,:),text(i)); 
       eval(['robot.keyPress(java.awt.event.KeyEvent.VK_',keyMatch{3,matchIdx},');']); 
      case {'~','_','+','<','>','?',':','{','}','|'} 
       robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 
       matchIdx = strcmp(keyMatch(2,:),text(i)); 
       eval(['robot.keyPress(java.awt.event.KeyEvent.VK_',keyMatch{3,matchIdx},');']); 
       robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
      case {'!','@','#','$','%','^','&','*','(',')'} 
       robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 
       matchIdx = strcmp(numKeyMatch(2,:),text(i)); 
       eval(['robot.keyPress(java.awt.event.KeyEvent.VK_',numKeyMatch{3,matchIdx},');']); 
       robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
      otherwise 
       error([text(i),' is unknown character']); 
     end 

    elseif strcmp(text(i),'<')||strcmp(text(i),'>') 
     robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 
     matchIdx = strcmp(keyMatch(2,:),text(i)); 
     eval(['robot.keyPress(java.awt.event.KeyEvent.VK_',keyMatch{1,matchIdx},');']); 
     robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
    else 
     error([text(i),' is unknown character']); 
    end 
end 

robot.keyPress(java.awt.event.KeyEvent.VK_ENTER); 
robot.keyRelease(java.awt.event.KeyEvent.VK_ENTER); 

end 
関連する問題