Wie führe ich einen internen cmd-Befehl von der Msys-Shell aus?

Wie führe ich einen internen cmd-Befehl von der Msys-Shell aus?

Das Windows- CMDDienstprogramm verfügt über eine Reihe interner Befehle, wie z. B. . Wie können diese von der Shell aus mklinkverwendet werden ?msys

AusCMD's Dokumentation, der /cSchalter kann verwendet werden, um einen Befehl auszuführen und zu beenden; das scheint aber nicht zu funktionieren.

  • Wenn ich das tue, wird cmd /c mklinkder mklinkBefehl nicht ausgeführt und die CMDShell nicht beendet.

Vor dem Drücken der Eingabetaste:

Bildbeschreibung hier eingeben

Nach:

Bildbeschreibung hier eingeben

Screenshot des Prozessmonitors:

Bildbeschreibung hier eingeben

  • Versuch, den Befehl als Hintergrundprozess auszuführen: cmd /c mklink &funktioniert anscheinend - der mklinkBefehl wird ausgeführt, aber die CMDShell wird nicht beendet. Jedes Mal, Enterwenn gedrückt wird, CMDwird die aktive Shell.

Antwort1

  1. Durchsuchen Sie Ihren %PATH% nach cmd.cmd oder cmd.bat. Diese könnten mit Ihrem cmd in Konflikt geraten.

  2. 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 msyskonvertiert ; es muss maskiert werden: . Wie diese Konvertierungen durchgeführt werden, wird erklärt/cc:\cmd //c mklinkHier. – 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 mklinkbemängelte, dass /msys64dies 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=NEWParametererweiterungssyntax 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 msyskonvertiert ; es muss maskiert werden: . Wie diese Konvertierungen durchgeführt werden, wird erklärt/cc:\cmd //c mklinkHier. – Mihai Rotaru1. Januar '13 um 21:32

Diese /cKonvertierung 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_EXCLkann entweder „ *alles ausschließen“ bedeuten oder eine Liste mit einem oder mehreren durch getrennten Argumentpräfixen sein ;, wie etwa MSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test [...]

verwandte Informationen