Wie führe ich den internen Befehl cmd in der msys-Shell aus?

19

Das Windows- CMDDienstprogramm verfügt über eine Reihe von internen Befehlen, z mklink. Wie können sie von der msysShell verwendet werden?

Aus CMDder Dokumentation kann der /cSchalter verwendet werden, um einen Befehl auszuführen und zu beenden. aber das scheint nicht zu funktionieren.

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

Bevor Sie die Eingabetaste drücken:

Bildbeschreibung hier eingeben

Nach:

Bildbeschreibung hier eingeben

Prozessmonitor-Screenshot:

Bildbeschreibung hier eingeben

  • Der Versuch, den Befehl als Hintergrundprozess auszuführen: cmd /c mklink &funktioniert anscheinend - der mklinkBefehl wird ausgeführt, die CMDShell wird jedoch nicht beendet. Jedes Mal Enter, wenn gedrückt wird, CMDwird die aktive Shell.
Mihai Rotaru
quelle
cmd /c mklinkarbeitet für mich mit meiner C-Shell, mit Cygwin bashund mit cmd.exe. Aber ich musste erhöht laufen, sonst bekam ich Beschwerden: "Sie haben nicht genügend Rechte, um diese Operation auszuführen." Ich habe es nicht versucht, msysweil ich es nicht installiert habe, aber ich bin skeptisch, dass das das Problem ist. Ich bin misstrauisch, dass noch etwas los ist. Ein Transkript oder ein Screenshot davon, was Sie getan haben und was passiert ist, könnte hilfreich sein.
Nicole Hamilton
@NicoleHamilton, Screenshots hinzugefügt. Für mklinkdie Arbeit muss die Shell tatsächlich als Administrator ausgeführt werden. Mein Problem ist jedoch, dass ich keinen der internen Befehle ausführen kann, ohne dass die cmdShell die Funktion übernimmt oder im Hintergrund ausgeführt wird. Dieses Problem tritt auch bei einfacheren Befehlen auf, für die kein Administrator erforderlich ist, z dir.
Mihai Rotaru
Haben Sie einen Alias, eine Prozedurdefinition oder ein Skript, das möglicherweise abfängt cmd?
Nicole Hamilton
@NicoleHamilton, nein; Ich habe den Rat von @Maxiums befolgt und Process Monitor ausgeführt, und wie im Screenshot im Anhang zu sehen ist, besteht das Problem darin, dass die msysKonvertierung /cin erfolgt c:\ . Die Antwort ist, es zu entkommen und den Befehl als auszuführen cmd //c mklink.
Mihai Rotaru

Antworten:

14
  1. Durchsuchen Sie% PATH% nach cmd.cmd oder cmd.bat. Sie können Ihre cmd stören

  2. Führen Sie Process Monitor aus und führen Sie Ihr cmd /c mklink. Untersuchen Sie das ProcMon-Protokoll auf tatsächlich ausgeführte Befehle.

Maximus
quelle
26
Process Monitor hat das Problem aufgespürt. Es ist das msyswird konvertieren /czu c:\ ; Es muss entronnen cmd //c mklink. Die Art und Weise, wie diese Konvertierungen durchgeführt werden, wird hier erläutert .
Mihai Rotaru
1
@MihaiRotaru Dieser Kommentar sollte eine Antwort sein
laktak
2

win7 / cygwin / bash hatte das gleiche Problem. Die Lösung besteht darin, cmd zweimal zu starten und Schrägstriche nach Bedarf von cmd in umgekehrte Schrägstriche 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

mosh
quelle
1

Process Monitor hat das Problem aufgespürt. Es ist das msyswird konvertieren /czu c:\; Es muss entronnen cmd //c mklink. Die Art und Weise, wie diese Konvertierungen durchgeführt werden, wird hier erläutert . - Mihai Rotaru 1. Januar 13 um 21:32 Uhr

Ich konnte dies nicht allein auf Grundlage von Mihais Kommentar zum Laufen bringen, da der Pfad immer noch Schrägstriche enthielt /und sich darüber mklinkbeschwerte, dass dies /msys64kein gültiger Wechsel war.

Also habe ich ein Batch-Skript geschrieben, damit es funktioniert.

So rufe ich mein Batch-Skript von MSYS aus auf:

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

Das Stapelskript verwendet diese beiden Pfade und konvertiert /sie \mithilfe der :OLD=NEWParametererweiterungssyntax zum Ersetzen von Zeichenfolgen in. 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

jpaugh
quelle