Bagaimana menjalankan perintah cmd internal dari shell msys?

19

CMDUtilitas Windows memiliki sejumlah perintah internal, seperti mklink. Bagaimana mereka bisa digunakan dari msysshell?

Dari CMDdokumentasi , /csaklar dapat digunakan untuk menjalankan perintah dan keluar; tapi ini sepertinya tidak berhasil.

  • Jika saya melakukan cmd /c mklinkitu mklinkperintah tidak dijalankan dan CMDshell tidak keluar.

Sebelum menekan Enter:

masukkan deskripsi gambar di sini

Setelah:

masukkan deskripsi gambar di sini

Tangkapan layar Monitor Proses:

masukkan deskripsi gambar di sini

  • Mencoba menjalankan perintah sebagai proses latar belakang: cmd /c mklink &tampaknya berfungsi - mklinkperintah dijalankan, tetapi CMDshell tidak dihentikan. Setiap kali Enterditekan, CMDakan menjadi shell yang aktif.
Mihai Rotaru
sumber
cmd /c mklinkbekerja untuk saya dengan shell C saya, dengan Cygwin bashdan dengan cmd.exe. Tapi saya memang harus menjalankan ditinggikan atau saya mendapat keluhan, "Anda tidak memiliki hak yang cukup untuk melakukan operasi ini." Saya belum mencoba msyskarena saya belum menginstalnya tetapi saya ragu itulah masalahnya. Saya curiga ada hal lain yang terjadi. Transkrip atau cuplikan layar dari apa yang Anda lakukan dan apa yang terjadi mungkin membantu.
Nicole Hamilton
@NicoleHamilton, tangkapan layar ditambahkan. Agar mklinkberfungsi, shell memang perlu dijalankan sebagai administrator; tetapi masalah saya adalah bahwa saya tidak dapat menjalankan perintah internal apa pun tanpa cmdshell mengambil alih atau berjalan di latar belakang. Masalah ini juga hadir untuk perintah sederhana yang tidak memerlukan admin, seperti dir.
Mihai Rotaru
Apakah Anda memiliki alias, definisi prosedur atau skrip yang mungkin mencegat cmd?
Nicole Hamilton
@NicoleHamilton, tidak; Saya mengambil saran @Maxiums dan menjalankan Process Monitor, dan seperti yang dapat dilihat pada tangkapan layar yang saya lampirkan, masalahnya adalah msyskonversi /cke c:\ . Jawabannya adalah untuk menghindarinya, dan jalankan perintah sebagai cmd //c mklink.
Mihai Rotaru

Jawaban:

14
  1. Cari% PATH% Anda untuk cmd.cmd atau cmd.bat. Mereka dapat mengganggu cmd Anda

  2. Jalankan Monitor Proses dan jalankan cmd /c mklink. Periksa log ProcMon untuk perintah yang benar-benar dijalankan.

Maximus
sumber
26
Process Monitor membantu melacak masalah ini. Itu yang msysakan dikonversi /cmenjadi c:\ ; perlu melarikan diri: cmd //c mklink. Cara konversi ini dilakukan dijelaskan di sini .
Mihai Rotaru
1
@MihaiRotaru komentar ini seharusnya menjadi jawaban
laktak
2

win7 / cygwin / bash memiliki masalah yang sama, solusinya adalah meluncurkan cmd dua kali, dan mengonversi garis miring menjadi garis miring terbalik seperti yang dibutuhkan oleh cmd (misalnya): 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
sumber
1

Process Monitor membantu melacak masalah ini. Itu yang msysakan dikonversi /cmenjadi c:\; perlu melarikan diri: cmd //c mklink. Cara konversi ini dilakukan dijelaskan di sini . - Mihai Rotaru 1 Jan '13 pada 21:32

Saya tidak bisa mendapatkan ini bekerja berdasarkan komentar Mihai saja, karena jalan masih berisi garis miring /di dalamnya, dan mklinkmengeluh bahwa /msys64itu bukan saklar yang valid.

Jadi saya menulis skrip batch untuk membuatnya berfungsi.

Inilah cara saya memanggil skrip batch dari MSYS:

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

Dan, skrip batch mengambil dua jalur tersebut, dan dikonversi /menjadi \, menggunakan :OLD=NEWsintaks ekspansi parameter untuk penggantian string. 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 Ini mirip dengan ${PARAM:/OLD/NEW}sintaks bash , bagi mereka yang akrab dengannya

jpaugh
sumber