Làm thế nào để chạy lệnh cmd nội bộ từ shell msys?


19

CMDTiện ích Windows có một số lệnh nội bộ, chẳng hạn như mklink. Làm thế nào chúng có thể được sử dụng từ msysvỏ?

Từ CMDtài liệu của , công /ctắc có thể được sử dụng để thực hiện lệnh và thoát; nhưng điều này dường như không hoạt động.

  • Nếu tôi làm cmd /c mklinkcác mklinklệnh không được thực hiện và CMDvỏ không thoát.

Trước khi nhấn Enter:

nhập mô tả hình ảnh ở đây

Sau:

nhập mô tả hình ảnh ở đây

Ảnh chụp màn hình tiến trình:

nhập mô tả hình ảnh ở đây

  • Cố gắng chạy lệnh như một quá trình nền: cmd /c mklink &rõ ràng hoạt động - mklinklệnh được thực thi, nhưng CMDshell không bị chấm dứt. Mỗi lần Enternhấn, CMDsẽ trở thành vỏ hoạt động.

cmd /c mklinklàm việc cho tôi với vỏ C của tôi, với Cygwin bashvà với cmd.exe. Nhưng tôi đã phải chạy trên cao nếu không tôi nhận được khiếu nại, "Bạn không có đủ đặc quyền để thực hiện thao tác này." Tôi chưa thử msysvì tôi chưa cài đặt nhưng tôi nghi ngờ đó là vấn đề. Tôi nghi ngờ có điều gì khác đang xảy ra. Một bản ghi hoặc ảnh chụp màn hình về những gì bạn đã làm và những gì đã xảy ra có thể hữu ích.
Nicole Hamilton

@Nicole Hamilton, ảnh chụp màn hình được thêm vào. Để mklinklàm việc, shell thực sự cần phải được chạy với tư cách quản trị viên; nhưng vấn đề của tôi là tôi không thể chạy bất kỳ lệnh nội bộ nào mà không có trình cmdđiều khiển hoặc chạy trong nền. Vấn đề này cũng có mặt cho các lệnh đơn giản hơn không yêu cầu quản trị viên, chẳng hạn như dir.
Mihai Rotaru

Bạn có bí danh, định nghĩa thủ tục hoặc tập lệnh có thể bị chặn cmdkhông?
Nicole Hamilton

@Nicole Hamilton, không; Tôi đã lấy lời khuyên của @Maxiums và chạy Process Monitor, và như có thể thấy trong ảnh chụp màn hình tôi đính kèm, vấn đề là msyschuyển đổi /cthành c:\ . Câu trả lời là để thoát khỏi nó, và chạy lệnh như cmd //c mklink.
Mihai Rotaru

Câu trả lời:


14
  1. Tìm kiếm% PATH% của bạn cho cmd.cmd hoặc cmd.bat. Họ có thể can thiệp vào cmd của bạn

  2. Chạy Process Monitor và chạy của bạn cmd /c mklink. Kiểm tra nhật ký ProcMon cho các lệnh thực sự được thực thi.


26
Giám sát quá trình đã giúp theo dõi vấn đề. Đó là msyssẽ chuyển đổi /csang c:\ ; nó cần phải được trốn thoát : cmd //c mklink. Cách thức chuyển đổi được thực hiện được giải thích ở đây .
Mihai Rotaru

1
@MihaiRotaru bình luận này nên là một câu trả lời
laktak 15/03/2016

2

win7 / cygwin / bash có cùng một vấn đề, giải pháp là khởi chạy cmd hai lần và chuyển đổi dấu gạch chéo thành dấu gạch chéo ngược khi cần bởi cmd (ví dụ): 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


1

Giám sát quá trình đã giúp theo dõi vấn đề. Đó là msyssẽ chuyển đổi /csang c:\; nó cần phải được trốn thoát : cmd //c mklink. Cách thức chuyển đổi được thực hiện được giải thích ở đây . - Mihai Rotaru ngày 1 tháng 1 năm 13 lúc 21:32

Tôi không thể làm điều này hoạt động chỉ dựa trên nhận xét của Mihai , bởi vì đường dẫn vẫn chứa các dấu gạch chéo về phía trước /mklinkphàn nàn rằng đó /msys64không phải là một công tắc hợp lệ.

Vì vậy, tôi đã viết một tập lệnh bó để làm cho nó hoạt động.

Đây là cách tôi gọi tập lệnh bó của mình từ MSYS:

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

Và, tập lệnh bó lấy hai đường dẫn đó và chuyển đổi /thành \, sử dụng :OLD=NEWcú pháp mở rộng tham số để thay thế chuỗi. 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 Điều này tương tự như ${PARAM:/OLD/NEW}cú pháp của bash , đối với những người quen thuộc với nó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.