質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

616閲覧

httpbin.org/ipからグローバルIPを取得するWindowsフォームアプリケーションを作りたい

Gunjirk

総合スコア23

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/04/02 00:31

編集2020/04/02 01:31

初心者なので、質問の仕方がわかりづらかったらすみません。

以下のソースコードでコマンドプロンプトからcurlを打ちたいのですが、実行すると何も書かれていないメッセージボックスが出るだけです。。

pingで試したらできたので、おそらくコマンドプロンプトは開けています。

curl.exeはC:\Program Files\curl-7.69.1-win64-mingw\binにあります。

参考サイトは、
http://dobon.net/vb/dotnet/process/standardoutput.html

よろしくお願いします。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace curl_API 12{ 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void button1_Click_1(object sender, EventArgs e) 21 { 22 23 //Processオブジェクトを作成 24 System.Diagnostics.Process p = new System.Diagnostics.Process(); 25 26 27 //OutputDataReceivedイベントハンドラを追加 28 p.OutputDataReceived += p_OutputDataReceived; 29 30 //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定 31 p.StartInfo.FileName = 32 System.Environment.GetEnvironmentVariable("ComSpec"); 33 //出力をストリームに書き込むようにする 34 p.StartInfo.UseShellExecute = false; 35 p.StartInfo.RedirectStandardOutput = true; 36 p.StartInfo.RedirectStandardInput = false; 37 //ウィンドウを表示しないようにする 38 p.StartInfo.CreateNoWindow = true; 39 40 string cmd = "curl httpbin.org/ip"; 41 p.StartInfo.Arguments = @"/c " + cmd; 42 43 //起動 44 p.Start(); 45 46 //非同期で出力の読み取りを開始 47 p.BeginOutputReadLine(); 48 49 p.WaitForExit(); 50 p.Close(); 51 52 Console.ReadLine(); 53 54 55 56 } 57 //OutputDataReceivedイベントハンドラ 58 //行が出力されるたびに呼び出される 59 static void p_OutputDataReceived(object sender, 60 System.Diagnostics.DataReceivedEventArgs e) 61 { 62 //出力された文字列を表示する 63 MessageBox.Show(e.Data); 64 } 65 } 66} 67

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/04/02 00:37

「できません」じゃなく「何が起きているのか」を書いた方がいいです。
Gunjirk

2020/04/02 00:40

失礼しました! 修正しました!
hihijiji

2020/04/02 01:17

非同期で書いているようですが、同期では取得できているのですか?
Gunjirk

2020/04/02 01:29

このコードも大本がコピペなので、非同期でしか試していません!
Y.H.

2020/04/02 01:36

curl.exeはC:\Program Files\curl-7.69.1-win64-mingw\binにあります。 pathは通ってるんでしょうか?
Gunjirk

2020/04/02 01:41

コマンドプロンプトでコマンドを実行すると、期待値が取得できるので、パスが通っている認識です! C:\Users\XXX>cd C:\Program Files\curl-7.69.1-win64-mingw\bin C:\Program Files\curl-7.69.1-win64-mingw\bin>curl httpbin.org/ip { "origin": "165.76.168.60" } C:\Program Files\curl-7.69.1-win64-mingw\bin>
Y.H.

2020/04/02 01:45

> cd C:\Program Files\curl-7.69.1-win64-mingw\bin cd "C:\Program Files\curl-7.69.1-win64-mingw\bin" じゃなくて? っていうよりCDしてますね。 cd でカレントディレクトリ移動せずに 実行デキないならpath 通ってないです。
tamoto

2020/04/02 01:47

C# で Web サービスから IP を取るのに curl を使う必要は全く無いので、IP を取りたいのか curl を使いたいのか、どちらかはっきりさせたほうが良いと思います。
Zuishin

2020/04/02 01:58

コピペしたなら必ず、くどいようですが、必ず、出典を明記してください。
guest

回答1

0

ベストアンサー

下記は、コマンドから返された文字列を表示するイベントのようですね。
System.Diagnostics.DataReceivedEventArgs

参考URL:https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.datareceivedeventargs?view=netframework-4.8

意図している動きか分かりませんが、メッセージボックスで表示させたいのであれば、下記のように変更してみては如何でしょうか?

C#

1 private static string strcmd = ""; //文字列受け取り用 2 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void Button1_Click(object sender, EventArgs e) 9 { 10 //Processオブジェクトを作成 11 System.Diagnostics.Process p = new System.Diagnostics.Process(); 12 13 14 //OutputDataReceivedイベントハンドラを追加 15 p.OutputDataReceived += p_OutputDataReceived; 16 17 //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定 18 p.StartInfo.FileName = 19 System.Environment.GetEnvironmentVariable("ComSpec"); 20 21 //出力をストリームに書き込むようにする 22 p.StartInfo.UseShellExecute = false; 23 p.StartInfo.RedirectStandardOutput = true; 24 p.StartInfo.RedirectStandardInput = false; 25 //ウィンドウを表示しないようにする 26 p.StartInfo.CreateNoWindow = true; 27 28 string cmd = "curl httpbin.org/ip"; 29 p.StartInfo.Arguments = @"/c " + cmd; 30 31 strcmd = @"/c " + cmd + Environment.NewLine; // コマンドを打ったことを記録 32 33 //起動 34 p.Start(); 35 36 //非同期で出力の読み取りを開始 37 p.BeginOutputReadLine(); 38 39 p.WaitForExit(); 40 p.Close(); 41 42 MessageBox.Show(strcmd); //表示 43 44 //Console.ReadLine(); 45 46 } 47 48 //OutputDataReceivedイベントハンドラ 49 //行が出力されるたびに呼び出される 50 static void p_OutputDataReceived(object sender, 51 System.Diagnostics.DataReceivedEventArgs e) 52 { 53 //出力された文字列を表示する 54 //MessageBox.Show(e.Data); 55 strcmd = strcmd + e.Data + Environment.NewLine; //リダイレクトされてくる文字列を格納 56 }

投稿2020/04/02 02:42

編集2020/04/02 11:19
SN_Ares

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gunjirk

2020/04/02 04:10

ありがとうございます! あと、curl httpbin.org/ipをコマンドプロンプト上で打って結果をメッセージボックスで表示させたいです。
SN_Ares

2020/04/02 10:35

下記のコードでコマンドは打たれていると思います。 ```C# string cmd = "curl httpbin.org/ip"; p.StartInfo.Arguments = @"/c " + cmd; ``` コマンドプロンプト上ということは、コマンドプロンプトを起動したいという事でしょうか??
Y.H.

2020/04/02 10:47

SN_Aresさん cmd.exe経由でcurl実行のコードですよ。 p.StartInfo.FileNameにcmd.exe(環境変数 ComSpec)を指定
SN_Ares

2020/04/02 11:21

Y.Hさん えーと、、それはもう経由しているという事で良いですよね? Gunjirkさん コードを変更してみました。こういうことで良いですか??
Y.H.

2020/04/02 11:23

はい。
Y.H.

2020/04/02 11:33

なのでうまくいかない原因は、cmd.exeがcurlを見つけられてないだけたと思います。 「質問への追記・修正、ベストアンサー選択の依頼」に記載している通りで 「C:\Program Files\curl-7.69.1-win64-mingw\bin」にPATHが通ってないだけだと思いますよ。
SN_Ares

2020/04/03 17:09 編集

あ、申し訳ありません。 「質問への追記・修正、ベストアンサー選択の依頼」に記載あったんですね。完全に見落としていました(^^;)(そういう欄もあるんですね・・・)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問