web-dev-qa-db-ja.com

WSL内のemacs内からコマンド(cmd.exe)を実行する方法は?

Windows 10でWSL(Unbuntu)を開くと、VcXsrvで実行されているemacsが起動しました。「Shell」を呼び出すと、bashシェルが正常に実行されます。ただし、実行したいコマンドファイルがいくつかあります。特に、Windows Studioのコマンドラインツールをdosのような環境で実行したいので、最初に「c:\ program files(x86)\ Microsoftvisual studion ...\vsvars.bat」を実行してから、「xyzzy.cmd」を実行します。 "nmakeを呼び出して、レガシーテストプログラムをビルドおよび実行するスクリプト。

両方をbashから直接実行しようとしましたが、機能しません(当然のことです)。次に、emacsでシェルインタープリターとしてc:\ windows ...\cmd.exeを呼び出してみましたが、プロンプトが表示されないようです。シェルを吊るすだけです。また、Windows上で直接実行されているemacsで使用する「cmdproxy.exe」も試してみましたが、うまくいきませんでした。

現在、私はWindows上で直接1つのemacsを実行しています(そして、シェルを呼び出すと、正しく理解していれば(cmdproxy.exeを使用して)コマンドが表示されます)。スクリプトを実行でき、emacsが出力をバッファーにキャプチャし、それをファイルに書き込むことができるという点で。そして、実際の編集を行うために上記で説明した個別のemacsがあり、そこでファイルを読み取ります。 emacsを1つだけにしたいので、emacs関数を使用してバッファーを切り替えるなどできます。

(ちなみに、cygwinでできると思いますが、WSLを使いたいです。)

Emacsでシェルウィンドウを開き、その中にcmd.exeへのパスを入力するとどうなりますか($は私のシェルプロンプトです):

$ ls -l  /mnt/c/Windows/System32/cmd.exe
-r-xr-xr-x 2 cfclark cfclark 280064 Oct 28 23:03 /mnt/c/Windows/System32/cmd.exe
$ /mnt/c/Windows/System32/cmd.exe /?
[6n

その時点で、シェルはハングしています。

しかし、あなたの答えは私にアイデアを与えました、そして私はより近くにいます:

$ /mnt/c/Windows/System32/cmd.exe /C z:/testbase/cpandrun.cmd -next -rev24 | cat
The system cannot find the path specified.
 +----------------------------------------------------------------------
  Setting up environment vars to build the tutorials with MVC++ 2019
 +----------------------------------------------------------------------
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\cfclark\AppData\Roaming
...  (lots of environment variables omitted)
The system cannot find the path specified.
yxx1.exe does not exist
Too many of the files: yxx.exe and yxxdiff.cmd 
         or yxx1.exe, yxx2.exe, and yxx.cmd.cmd
are missing from \yxx.24\bin.
The system cannot find the file specified.
The system cannot find the path specified.
Done!
The system cannot find the path specified.
Done!

.cmdファイルは結合されたディレクトリから実行されることが期待されているため、パーティションのルートのように見えますが、おそらく.cmdスクリプトで修正できます。

1
intel_chris

この作業をemacsの内部(wslの内部)から取得するには、次の行に「| cat」を追加する必要があります。

/mnt/c/Windows/System32/cmd.exe/c path_to_run.cmd |ネコ

これにより、emacsシェルバッファーに表示される出力が取得され、バッファーに入力された入力も待機します。少なくとも、私の.cmdファイルの「pause」コマンドには当てはまりました。

1
intel_chris