HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0119
cmdコマンドプロンプトに文字(コマンド)を入力したい10解決


cmd

リンク

2016/1/19(Tue) 18:18:19|NO.74190


exec "cmd.exe /E:ON /V:ON /K \"\"C:\\Program Files (x86)\\Intel\\Composer XE 2013 SP1\\bin\\ipsxe-comp-vars.bat\" ia32 vs2013\""
でコマンドプロンプトを立ち上げるところまではできたのですが、ifort "ファイル名"(実行)
といったような作業をしていきたいのですが文字列をコマンドプロンプトに送る方法がいまいちわかりません。
どのようにして送ればいいでしょうか?



この記事に返信する


kanamaru

リンク

2016/1/19(Tue) 18:27:15|NO.74191

/cオプションを使ってください。
例えば、
cmd.exe /c pause
とかいうふうに使えます。



cmd

リンク

2016/1/19(Tue) 18:34:39|NO.74192

>kanamaruさん

回答ありがとうございます。

exec "cmd.exe /E:ON /V:ON /K /c pause \"\"C:\\Program Files (x86)\\Intel\\Composer XE 2013 SP1\\bin\\ipsxe-comp-vars.bat\" ia32 vs2013\""

私も、/c 〜でできると思いやってみたのですが
'/c' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Users\xxx\Documents\HSP\test>
となってしまい駄目でした。



zero

リンク

2016/1/19(Tue) 20:08:49|NO.74193

/C … 後続のコマンドを実行後、終了する
/K … 後続のコマンドを実行後、終了しない

NO.74192のコマンドでは、/Kの後に/cが指定されているため、
/cがコマンドとして認識されています(コマンドではないためエラー)。
ですので/Cを使用する場合は/Kを取り除いてください。



cmd

リンク

2016/1/19(Tue) 21:41:29|NO.74196

>zeroさん
回答ありがとうございます。
/Kを入力しないとウインドウが閉じてしまうので、/Kでは駄目でしょうか?

イメージとしては

Intel(R) Parallel Studio XE 2013 SP1
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.
Intel(R) Composer XE 2013 SP1 Update 4 (package 237)


C:\Users\xxx\HSP\test>ifort "C:\xxxx\xxx.f"

のような形で入力して実行したいです。



zero

リンク

2016/1/19(Tue) 22:20:50|NO.74197

起動させたコマンドプロンプトにコマンドを逐次送信したいということですか?

以下のコードは私の作りかけのプログラムから抜き出して少し変更したものですが、
もしかしたらこれが使えるかもしれません。

コマンドプロンプトの起動は exec "コマンド" の代わりに、
 exec_ "コマンド" を使ってください。そうすれば
writeInput "文字列" で文字列を送信できます。
("exit"で終了させることが出来ないという欠点がありますが。)


#include "kernel32.as" #uselib "kernel32.dll" #func global AttachConsole "AttachConsole" sptr #module #define STD_INPUT_HANDLE (-10) #define KEY_EVENT 0x0001 // Event contains key event record #define NLS_DBCSCHAR 0x00010000 // DBCS for JPN: SBCS/DBCS mode. #define NLS_HIRAGANA 0x00040000 // DBCS for JPN: Hiragana mode. #define NLS_IME_CONVERSION 0x00800000 // DBCS for JPN: IME conversion. /* exec_ "コマンド" HSPからコマンドプロンプトに文字列を入力するための、 コンソールプロセスを実行する。 */ #deffunc exec_ str _cmdline cmdline = _cmdline sdim si, 68 : lpoke si, 0, 68 sdim pi, 16 CreateProcess 0, varptr(cmdline), 0, 0, 1, 0, 0, 0, varptr(si), varptr(pi) if (stat == 0) : return hproc = lpeek(pi, 0) pid = lpeek(pi, 8) //コンソールの stdin を取得 await 100 AttachConsole pid GetStdHandle STD_INPUT_HANDLE stdin = stat return /* writeInput "文字列" コマンドプロンプトに文字列を入力する。 */ #deffunc writeInput str _string // 改行コード'\n'は無いものと仮定 string = _string nBuf = strlen(string) + 2 sdim buf, nBuf * 20 repeat strlen(string) wpoke buf, 0 + cnt*20, KEY_EVENT lpoke buf, 4 + cnt*20, 1 // bKeyDown wpoke buf, 8 + cnt*20, 1 // wRepeatCount poke buf, 14 + cnt*20, peek(string, cnt) // AsciiChar lpoke buf, 16 + cnt*20, (NLS_DBCSCHAR | NLS_HIRAGANA | NLS_IME_CONVERSION) loop // 最後にEnterキーを追加 i = 0 repeat 2, strlen(string) wpoke buf, 0 + cnt*20, KEY_EVENT lpoke buf, 4 + cnt*20, (1-i) // bKeyDown :: 1回目=押し下げ, 2回目=押し上げ wpoke buf, 8 + cnt*20, 1 // wRepeatCount wpoke buf, 10 + cnt*20, 13 // wVirtualKeyCode wpoke buf, 12 + cnt*20, 28 // wVirtualScanCode poke buf, 14 + cnt*20, 13 // uChar.AsciiChar lpoke buf, 16 + cnt*20, (NLS_DBCSCHAR | NLS_HIRAGANA) i++ loop num = 0 WriteConsoleInput stdin, varptr(buf), nBuf, varptr(num) return /* exec_ で起動したプロセスを終了する。 */ #deffunc exitConsole FreeConsole TerminateProcess hproc, 0 stdin = 0 return #global // テストプログラム(参考) #if 0 *main title "Shift+Enterで入力" onexit *exit exec_ "cmd" inputString = "" pos 150, 100 input inputString, 340, 20 : id_input = stat state0 = 0 repeat getkey shift, 16 getkey enter, 13 state = shift && enter if (state0 == 0 && state == 1) { state = 1 gosub *fire } await state0 = state loop stop *fire writeInput inputString objprm id_input, "" return *exit exitConsole end #endif



zero

リンク

2016/1/19(Tue) 22:43:19|NO.74198

すいません、話が飛んでしまったかもしれないので補足します。

上のソースを貼っつけておいて、


exec_ "cmd.exe /E:ON /V:ON /K \"\"C:\\Program Files (x86)\\Intel\\Composer XE 2013 SP1\\bin\\ipsxe-comp-vars.bat\" ia32 vs2013\""
でコマンドプロンプトを立ち上げます。それから

writeInput "ifort \"C:\xxxx\xxx.f\""
こんな感じにやれば ifort〜 のコマンドがコマンドプロンプトに送信できます。



zakki

リンク

2016/1/19(Tue) 23:48:04|NO.74199

同じような機能でhspext.asの pipeexec pipeget pipeput もありますね



toto

リンク

2016/1/20(Wed) 00:50:05|NO.74201

確かcmdは&でつなげば複数のコマンドを実行できたと思います。
こんな感じで

exec "cmd /c dir & echo メモ帳起動します。 & pause & notepad"



KA

リンク

2016/1/20(Wed) 05:58:35|NO.74202

文字列をコピペしてリターンを送信。



cmd

リンク

2016/1/20(Wed) 16:19:52|NO.74205

みなさん回答ありがとうございます。

みなさまの回答のおかげで無事解決しました。
今回はコマンドプロンプトを起動して、そのまま自動実行したかったのでzeroさんのプログラムを参考にさせていただきたいと思います。



ONION software Copyright 1997-2021(c) All rights reserved.