WindowsCMD
ユーティリティには、 などの内部コマンドが多数ありますmklink
。これらをシェルからどのように使用すればよいでしょうかmsys
?
からCMD
のドキュメントスイッチ/c
を使用してコマンドを実行し、終了することができますが、これは機能しないようです。
- これを実行すると、
cmd /c mklink
コマンドmklink
は実行されず、CMD
シェルは終了しません。
Enter キーを押す前に:
後:
プロセス モニターのスクリーンショット:
- コマンドをバックグラウンド プロセスとして実行しようとしています。
cmd /c mklink &
どうやら動作するようです。mklink
コマンドは実行されますが、CMD
シェルは終了しません。Enter
押すたびに、CMD
アクティブなシェルになります。
答え1
%PATH%でcmd.cmdまたはcmd.batを検索してください。これらはcmdに干渉する可能性があります。
走るプロセスモニターを実行します
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
変換されます。エスケープする必要があります: 。これらの変換が行われる方法は説明されています/c
c:\
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
変換されます。エスケープする必要があります: 。これらの変換が行われる方法は説明されています/c
c:\
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