🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Visual Studio

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1083閲覧

visual stdioで書いたc++コードにコマンドを書き、WSLに自動でコマンドを実行させたい

mikku_taka

総合スコア20

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Visual Studio

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/31 02:49

前提・実現したいこと

Visual Stdio上のC++コードにUbuntuのコマンドを記述し、WSL自動起動及び** コードに書いたUbuntuコマンドの自動実行**を実現したいです。

発生している問題・エラーメッセージ

WSLを開くことには成功しましたが、それ以降のコマンドは実行してくれなくて(入力待ちの状態に遷移)、参っています。
エラーは出力されていません。ただWSL上で自動でコマンドを実行させたいのです。
イメージ説明
↑ここに、コード上で書いたコマンドを自動で入力させたいです。でもWSLの起動のみでそれ以上の操作はやってくれません。

該当のソースコード

c++

1#include <stdio.h> 2#include <windows.h> 3#include "wiilib.h" 4 5#ifdef _DEBUG 6#pragma comment(lib,"libWiid.lib") 7#else 8#pragma comment(lib,"libWii.lib") 9#endif 10 11 12 13int main(int argc, char* argv[]) 14{ 15 WiiLib wii; 16 double x, y, z; 17 int flag1=0, flag2=0; 18 19 20 if (!wii.initWii()) {//Wiiリモコンを認識&初期化 21 return 0; 22 } 23 while (1) { 24 Sleep(500); 25 x = wii.getWiiAngle(Wii_X_AXIS); //加速度センサX軸の情報を取得 26 y = wii.getWiiAngle(Wii_Y_AXIS); //加速度センサY軸の情報を取得 27 z = wii.getWiiAngle(Wii_Z_AXIS); //加速度センサZ軸の情報を取得 28 printf("x:%lf y:%lf z:%lf\n", x, y, z); 29 if (y >= 0.7 && flag1==0) { 30 printf("tv-power-on\n"); 31 printf("x:%lf y:%lf z:%lf\n", x, y, z); 32 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -X POST \"https://api.nature.global/1/appliances/8916a417-cb09-4e6c-a3e1-318e3e297bac/tv\" -H \"accept: application/json\" -H \"Content-Type: application/x-www-form-urlencoded\" -d \"button=power\""); 33→WSL起動 system("ubuntu"); //WSL(ubuntu)を開く! 34→ここから無理system("curl -X PUT \"http://192.168.1.47/api/mCLlxuX4Y6e3pAJXFU61FRA0SDCDIp235WwzNvgP/lights/2/state\" -d '{\"on\":true}'");//この行含め実行できない…ライトをつける、 35 flag1 = 1; 36 Sleep(3000); 37 }else if(y >= 0.7 && flag1 == 1) { 38 printf("tv-power-off\n"); 39 printf("x:%lf y:%lf z:%lf\n", x, y, z); 40 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -X POST \"https://api.nature.global/1/appliances/8916a417-cb09-4e6c-a3e1-318e3e297bac/tv\" -H \"accept: application/json\" -H \"Content-Type: application/x-www-form-urlencoded\" -d \"button=power\""); 41 flag1 = 0; 42 Sleep(3000); 43 } 44 45 if (wii.getWiiState(Wii_BUTTON_B) && flag1 == 1 && x >= 1) { 46 printf("vol-up\n"); 47 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -X POST \"https://api.nature.global/1/appliances/8916a417-cb09-4e6c-a3e1-318e3e297bac/tv\" -H \"accept: application/json\" -H \"Content-Type: application/x-www-form-urlencoded\" -d \"button=vol-up\""); 48 Sleep(1000); 49 } 50 51 if (wii.getWiiState(Wii_BUTTON_B) && flag1 == 1 && x <= -1) { 52 printf("vol-down\n"); 53 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -X POST \"https://api.nature.global/1/appliances/8916a417-cb09-4e6c-a3e1-318e3e297bac/tv\" -H \"accept: application/json\" -H \"Content-Type: application/x-www-form-urlencoded\" -d \"button=vol-down\""); 54 Sleep(1000); 55 } 56 57 if (wii.getWiiState(Wii_BUTTON_B) && flag1 == 1 && x < 0.1 && x >= -0.2 && y < 0.7 && y >= -0.4 && z <= -1.5) { 58 printf("mute\n"); 59 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -X POST \"https://api.nature.global/1/appliances/8916a417-cb09-4e6c-a3e1-318e3e297bac/tv\" -H \"accept: application/json\" -H \"Content-Type: application/x-www-form-urlencoded\" -d \"button=mute\""); 60 Sleep(3); 61 } 62 63 if (y <= -1 && flag2 == 0) { 64 printf("fan-power-on\n"); 65 printf("x:%lf y:%lf z:%lf\n", x, y, z); 66 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -H \"accept: application/json\" -X POST \"https://api.nature.global/1/signals/{1dd66ccc-0405-404e-aa64-a42c1fcb8070}/send\" -H \"accept: application/json\" -H \"Content-Type:application/x-www-form-urlencoded\""); 67 flag2 = 1; 68 Sleep(3000); 69 }else if (y <= -1.4 && flag2 == 1) { 70 printf("fan-power-off\n"); 71 printf("x:%lf y:%lf z:%lf\n", x, y, z); 72 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -H \"accept: application/json\" -X POST \"https://api.nature.global/1/signals/{1dd66ccc-0405-404e-aa64-a42c1fcb8070}/send\" -H \"accept: application/json\" -H \"Content-Type:application/x-www-form-urlencoded\""); 73 flag2 = 0; 74 Sleep(3000); 75 } 76 77 if (wii.getWiiState(Wii_BUTTON_A) && flag2 == 1 && x >= 1) { 78 printf("power-up\n"); 79 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -H \"accept: application/json\" -X POST \"https://api.nature.global/1/signals/{011198f1-5bd5-4a6b-837e-2d9ae7377dd9}/send\" -H \"accept: application/json\" -H \"Content-Type:application/x-www-form-urlencoded\""); 80 81 } 82 83 if (wii.getWiiState(Wii_BUTTON_A) && flag2 == 1 && x <= -1) { 84 printf("power-down\n"); 85 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -H \"accept: application/json\" -X POST \"https://api.nature.global/1/signals/{53f4a211-8fa1-431c-9b80-bcd4ec6b3635}/send\" -H \"accept: application/json\" -H \"Content-Type:application/x-www-form-urlencoded\""); 86 87 } 88 89 if (wii.getWiiState(Wii_BUTTON_A) && flag2 == 1 && x < 0.1 && x >= -0.2 && y < 0.7 && y >= -0.4 && z <= -1.5) { 90 printf("mute\n"); 91 system("curl -H \"Authorization: Bearer HaAUxrm2EQBcSIKQwwqMnMc8Fz3WKF9zYw6vtNrhGsI.ylLDDl2Z2ZF-iA6xkVrDnxY63me098zIYF1JFF70IAQ\" -H \"accept: application/json\" -X POST \"https://api.nature.global/1/signals/{bef7c6e0-6287-407b-b86f-dd56a160d8f0}/send\" -H \"accept: application/json\" -H \"Content-Type:application/x-www-form-urlencoded\""); 92 Sleep(3); 93 } 94 95 } 96 return 0; 97} 98

試したこと

Systemコマンドの引数の一番後ろに[\n]をつけたりしました。
改行を用いることでコマンドが動くのでは?と思いましたが、良い結果は得られませんでした。

補足情報(FW/ツールのバージョンなど)

開発環境
windows10
visual stdio2019
WSLのバージョン
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

wsl コマンドを使ってください。コマンドライン引数に続けたコマンドを実行できます。

例: wsl ls

投稿2019/10/31 02:51

Zuishin

総合スコア28669

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

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

mikku_taka

2019/10/31 03:34

もう少しヒントを頂戴したいです… 試したこと system("WSL curl -X PUT \"http://192.168.1.47/api/mCLlxuX4Y6e3pAJXFU61FRA0SDCDIp235WwzNvgP/lights/2/state\" -d '{\"on\":true}'");//この行含め実行できない…ライトをつける、 system(WSL "curl -X PUT \"http://192.168.1.47/api/mCLlxuX4Y6e3pAJXFU61FRA0SDCDIp235WwzNvgP/lights/2/state\" -d '{\"on\":true}'");//この行含め実行できない…ライトをつける、 いずれの出力 WSLは内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。
Zuishin

2019/10/31 03:38

まず、wsl.exe にパスが通っているか確かめてください。通っていなければ通してください。 つぎに、実行したいコマンドをコマンドプロンプトから行って、できるかどうかを確かめてください。
mikku_taka

2019/10/31 03:44

pathに関しては調査してみます。
Zuishin

2019/10/31 03:51

全角になっているようです。system 関数の引数についても全角文字が含まれていないかチェックしてください。
mikku_taka

2019/11/01 04:32

ここのコメントではWSLとなってましたがプログラムはwslとなっており、他に全角は混ざっていませんでした。 pathも通せたとは思いますが、  「'wsl' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」  となってしまいます。 C:\Users\wasyo>echo %path% ↓実行結果 C:\Program Files (x86)\Common Files\Oracle\Java\javapath;…一部省略…C:\Users\wasyo\AppData\Roaming\npm;C:\MinGW\bin;C:\Windows\System32\wsl.exe;
Zuishin

2019/11/01 05:21

\wsl.exe が余計ですね。パスはディレクトリが対象です。
mikku_taka

2019/11/01 05:51

Zuishinさん 修正しましたが、ダメでした。 同じく 「'wsl' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と返ってきました。
mikku_taka

2019/11/01 05:53

Y.H.さん コマンドプロンプトでは、思い通りに動きました。 プログラムからは実行すると 「'c:/windows/system32/wsl.exe' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と返ってきました。
Zuishin

2019/11/01 06:00

もしかしてその実行ファイル、Ubuntu 上で動いてませんか? どのようにコンパイル、実行してます?
Zuishin

2019/11/01 06:05

> system("ubuntu"); また、もしこれを削除していないなら、削除してください。
mikku_taka

2019/11/01 06:18

Zuishinさん system("ubuntu");は削除しています。 実行の仕方は、VisualStudio2019でデバッグ→開始で行っています。
Zuishin

2019/11/01 06:23

system("wsl.exe ls"); だとどうなりますか?
mikku_taka

2019/11/01 06:54

「'wsl.exe' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と返ってきます。
Y.H.

2019/11/01 07:18

現象再現しました。mikku_takaさんと同じ結果でした。 ShellExecute()でやってみたけど、戻り値:2 (ERROR_FILE_NOT_FOUND) が返ってきますね。。。 #include <windows.h> int main(int argc, char* argv[]) { system("wsl ls"); system("wsl.exe ls"); system("c:/windows/system32/wsl.exe ls"); printf("%d",ShellExecute(NULL, NULL, TEXT("c:\windows\system32\wsl.exe"),NULL, NULL, SW_MAXIMIZE)); return 0; } ...\ConsoleApplication1\Debug>ConsoleApplication1.exe 'wsl' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 'wsl.exe' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 'c:/windows/system32/wsl.exe' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 2
YAmaGNZ

2019/11/01 07:37

wsl.exeは64ビット版のみで、32ビット版が存在しないので、%windir%\system32だけで、%windir%\sysWOW64には存在していない。 この為、32ビットアプリだとC:\windows\system32にアクセスしてもC:\windows\sysWOW64にリダイレクトされるので、wsl.exeが存在せずエラーとなっているのではないでしょうか? "C:\windows\Sysnative\wsl.exe"だとどうなるでしょうか?
mikku_taka

2019/11/01 07:38

Zuishinさん、Y.H.さん 32ビットから64ビットにターゲットを変更することで無事に実行できました! ありがとうございました!
mikku_taka

2019/11/01 07:42

YAmaGNZさん ”C:\windows\Sysnative\wsl.exe”で実行できました。ありがとうございました。
Y.H.

2019/11/01 07:53

YAmaGNZさん ご指摘の通りでした :-)
Zuishin

2019/11/01 08:11

コメントが埋もれているようなので、再掲します。 > 32 ビットのプロセスから wsl は見えないという情報がありました。64 ビットをターゲットにコンパイルしてみてください。
guest

0

YAmaGNZさんがおっしゃっていますが
「wsl.exeは64ビット版のみで、32ビット版が存在しないので、%windir%\system32だけで、%windir%\sysWOW64には存在していませんでした。
この為、32ビットアプリだとC:\windows\system32にアクセスしてもC:\windows\sysWOW64にリダイレクトされるので、wsl.exeが存在せずエラーとなっていました。」
結果として、
"C:\windows\Sysnative\wsl.exe"
を実行することで問題が解決しました。

投稿2019/11/01 07:54

編集2019/11/01 07:57
mikku_taka

総合スコア20

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

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

Zuishin

2019/11/01 07:57

私も解決法を書いていますが、それではだめだったということですか?
YAmaGNZ

2019/11/01 07:58

Sysnativeは64ビットアプリでは使用できないし、wsl.exe自体が64ビットのみなので、 特別な理由がないのであれば素直に64ビットアプリとし、"C:\windows\system32"へのアクセスとするほうがよろしいかと思います。
Zuishin

2019/11/01 08:04

それでなくとも最低限の小出しの情報しか出ない中で、時間をかけて問題を切り分けて原因を突き止めたのに、なぜ自己解決にできるんだろう。
Zuishin

2019/11/01 08:07

全角を使ったり、奇天烈な path を書いたりしない人が相手なら、もっと早く絞り込めて解決していました。
mikku_taka

2019/11/01 08:10

過去19件もコメントがついていたので、 まとめてしまったほうが、後でみられる方にも良いと思い、あえて自己解決で 解決方法を記述してしまいました。 直ちに、運営に問い合わせてベストアンサーがかわるよう 問い合わせてみます。 不快な思いをさせてしまい誠に申し訳ございませんでした。
Zuishin

2019/11/01 08:12 編集

取り消すボタンがデカデカと表示されているはずです。
mikku_taka

2019/11/01 08:15

変更しました。長時間に及び解答に付き合っていただき誠にありがとうございました。 今後このようなことが無いよう気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問