msys シェルから内部 cmd コマンドを実行するにはどうすればいいですか?

msys シェルから内部 cmd コマンドを実行するにはどうすればいいですか?

WindowsCMDユーティリティには、 などの内部コマンドが多数ありますmklink。これらをシェルからどのように使用すればよいでしょうかmsys?

からCMDのドキュメントスイッチ/cを使用してコマンドを実行し、終了することができますが、これは機能しないようです。

  • これを実行すると、cmd /c mklinkコマンドmklinkは実行されず、CMDシェルは終了しません。

Enter キーを押す前に:

ここに画像の説明を入力してください

後:

ここに画像の説明を入力してください

プロセス モニターのスクリーンショット:

ここに画像の説明を入力してください

  • コマンドをバックグラウンド プロセスとして実行しようとしています。cmd /c mklink &どうやら動作するようです。mklinkコマンドは実行されますが、CMDシェルは終了しません。Enter押すたびに、CMDアクティブなシェルになります。

答え1

  1. %PATH%でcmd.cmdまたはcmd.batを検索してください。これらはcmdに干渉する可能性があります。

  2. 走るプロセスモニターを実行しますcmd /c mklink。実際に実行されたコマンドについては、ProcMon ログを調べてください。

答え2

win7/cygwin/bash でも同じ問題が発生していましたが、解決策としては、cmd を 2 回起動し、cmd の必要に応じてスラッシュをバックスラッシュに変換します (例): REPO_DIR=${REPO_DIR////\\} # Example, Turn c:/cvs into c:\cvs for cmd
cmd /C "cmd /C mklink /D .Repo $REPO_DIR" # launch cmd /C cmd /C cmd

答え3

プロセスモニターは問題の追跡に役立ちました。 はにmsys変換されます。エスケープする必要があります: 。これらの変換が行われる方法は説明されています/cc:\cmd //c mklinkここ。 – ミハイ・ロタル2013年1月1日 21:32

私はこれをうまく動作させることができませんでしたミハイのコメントパスにはまだスラッシュが含まれていたため/、有効なスイッチではないmklinkというエラーが表示されました。/msys64

そこで、これを動作させるためのバッチ スクリプトを作成しました。

MSYS からバッチ スクリプトを呼び出す方法は次のとおりです。

 $ mingw_ln.bat "$destination" "$targetpath"

そして、バッチ スクリプトはこれら 2 つのパスを取得し、文字列置換のパラメータ拡張構文を使用して/に変換します。1\:OLD=NEW

set LINK=%1
set TARGET=%2

REM Convert POSIX paths to Windows paths
set LINK=%LINK:/=\%
set TARGET=%TARGET:/=\%

mklink /D %LINK% %TARGET%

1これはbashの${PARAM:/OLD/NEW}構文に似ています。

答え4

Mihai Rotaru 氏のコメントを詳しく説明します。

プロセスモニターは問題の追跡に役立ちました。 はにmsys変換されます。エスケープする必要があります: 。これらの変換が行われる方法は説明されています/cc:\cmd //c mklinkここ。 – ミハイ・ロタル2013年1月1日 21:32

環境変数 を使用することで、一部またはすべての引数に対してこの変換/cを回避することもできます。c:\MSYS2_ARG_CONV_EXCL

例えば

$ MSYS2_ARG_CONV_EXCL='*' /c/Windows/System32/cmd.exe /C "echo foo"

( と'*'"*"意味が異なるので注意してください。)

引用:MSYS2 ドキュメント:

MSYS2_ARG_CONV_EXCL*すべてを除外することを意味する 、または で区切られた 1 つ以上の引数のリスト ( [...];など)のいずれかになります。MSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test

関連情報