Das Windows- CMD
Dienstprogramm verfügt über eine Reihe interner Befehle, wie z. B. . Wie können diese von der Shell aus mklink
verwendet werden ?msys
AusCMD
's Dokumentation, der /c
Schalter kann verwendet werden, um einen Befehl auszuführen und zu beenden; das scheint aber nicht zu funktionieren.
- Wenn ich das tue, wird
cmd /c mklink
dermklink
Befehl nicht ausgeführt und dieCMD
Shell nicht beendet.
Vor dem Drücken der Eingabetaste:
Nach:
Screenshot des Prozessmonitors:
- Versuch, den Befehl als Hintergrundprozess auszuführen:
cmd /c mklink &
funktioniert anscheinend - dermklink
Befehl wird ausgeführt, aber dieCMD
Shell wird nicht beendet. Jedes Mal,Enter
wenn gedrückt wird,CMD
wird die aktive Shell.
Antwort1
Durchsuchen Sie Ihren %PATH% nach cmd.cmd oder cmd.bat. Diese könnten mit Ihrem cmd in Konflikt geraten.
LaufenProzessmonitorund führen Sie es aus
cmd /c mklink
. Untersuchen Sie das ProcMon-Protokoll auf tatsächlich ausgeführte Befehle.
Antwort2
Bei Win7/Cygwin/Bash gab es dasselbe Problem. Die Lösung besteht darin, cmd zweimal zu starten und Schrägstriche nach Bedarf in Backslashes umzuwandeln (zum Beispiel):
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
Antwort3
Process Monitor hat dabei geholfen, das Problem aufzuspüren. Es wird in
msys
konvertiert ; es muss maskiert werden: . Wie diese Konvertierungen durchgeführt werden, wird erklärt/c
c:\
cmd //c mklink
Hier. – Mihai Rotaru1. Januar '13 um 21:32
Ich konnte das nicht zum Laufen bringen, daMihais Kommentarallein, weil der Pfad immer noch Schrägstriche enthielt /
, und mklink
bemängelte, dass /msys64
dies kein gültiger Schalter sei.
Also habe ich ein Batch-Skript geschrieben, um es zum Laufen zu bringen.
So rufe ich mein Batch-Skript von MSYS aus auf:
$ mingw_ln.bat "$destination" "$targetpath"
Und das Batch-Skript nimmt diese beiden Pfade und konvertiert sie /
in \
, wobei die :OLD=NEW
Parametererweiterungssyntax für Zeichenfolgenersetzungen verwendet wird. 1
set LINK=%1
set TARGET=%2
REM Convert POSIX paths to Windows paths
set LINK=%LINK:/=\%
set TARGET=%TARGET:/=\%
mklink /D %LINK% %TARGET%
1 Dies ähnelt der ${PARAM:/OLD/NEW}
Syntax von Bash. Für diejenigen, die damit vertraut sind
Antwort4
Ergänzung zu Mihai Rotarus Kommentar:
Process Monitor hat dabei geholfen, das Problem aufzuspüren. Es wird in
msys
konvertiert ; es muss maskiert werden: . Wie diese Konvertierungen durchgeführt werden, wird erklärt/c
c:\
cmd //c mklink
Hier. – Mihai Rotaru1. Januar '13 um 21:32
Diese /c
Konvertierung c:\
kann für einige oder alle Argumente auch durch Verwendung der Umgebungsvariable vermieden werden MSYS2_ARG_CONV_EXCL
.
Z.B
$ MSYS2_ARG_CONV_EXCL='*' /c/Windows/System32/cmd.exe /C "echo foo"
(Vorsicht, da '*'
und "*"
unterschiedliche Bedeutungen haben.)
Unter Berufung auf dieMSYS2-Dokumente:
MSYS2_ARG_CONV_EXCL
kann entweder „*
alles ausschließen“ bedeuten oder eine Liste mit einem oder mehreren durch getrennten Argumentpräfixen sein;
, wie etwaMSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test
[...]