วิธีการเรียกใช้คำสั่ง cmd ภายในจากเปลือก msys?


19

ของ Windows ยูทิลิตี้ที่มีจำนวนของคำสั่งภายในเช่นCMD mklinkพวกมันสามารถใช้งานได้อย่างไรจากmsysเปลือก?

จากCMDเอกสารของ/cสวิตช์สามารถใช้เพื่อรันคำสั่งและออก แต่ดูเหมือนว่าจะไม่ทำงาน

  • ถ้าฉันทำคำสั่งจะไม่ทำงานและเปลือกจะไม่ออกcmd /c mklinkmklinkCMD

ก่อนกด Enter:

ป้อนคำอธิบายรูปภาพที่นี่

หลังจาก:

ป้อนคำอธิบายรูปภาพที่นี่

ภาพหน้าจอการตรวจสอบกระบวนการ:

ป้อนคำอธิบายรูปภาพที่นี่

  • กำลังพยายามเรียกใช้คำสั่งเป็นกระบวนการพื้นหลัง: cmd /c mklink &เห็นได้ชัดว่าใช้งานได้ - mklinkมีการดำเนินการคำสั่ง แต่CMDเชลล์ไม่ได้ถูกยกเลิก ทุกครั้งที่EnterกดCMDจะกลายเป็นกระสุนที่ใช้งานอยู่

cmd /c mklinkการทำงานสำหรับฉันกับ C เปลือกของฉันกับ Cygwin และbash cmd.exeแต่ฉันต้องทำการยกระดับหรืออื่น ๆ ที่ฉันได้รับการร้องเรียน "คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการนี้" ฉันไม่ได้ลองmsysเพราะฉันยังไม่ได้ติดตั้ง แต่ฉันสงสัยว่าเป็นปัญหา ฉันสงสัยว่ามีบางอย่างเกิดขึ้น สำเนาหรือภาพหน้าจอของสิ่งที่คุณทำและสิ่งที่เกิดขึ้นอาจเป็นประโยชน์
นิโคลแฮมิลตัน

@NicoleHamilton เพิ่มภาพหน้าจอ ในmklinkการทำงานเชลล์จำเป็นต้องถูกรันในฐานะผู้ดูแลระบบ แต่ปัญหาของฉันคือฉันไม่สามารถเรียกใช้คำสั่งภายในใด ๆ โดยที่cmdเชลล์ไม่สามารถควบคุมหรือรันในพื้นหลังได้ dirปัญหานี้ยังมีอยู่สำหรับคำสั่งที่เรียบง่ายซึ่งไม่จำเป็นต้องดูแลระบบเช่น
Mihai Rotaru

คุณมีนามแฝงนิยามโพรซีเดอร์หรือสคริปต์ที่อาจถูกดักจับcmdหรือไม่?
นิโคลแฮมิลตัน

@ NicoleHamilton, ไม่; ผมเอา @Maxiums' คำแนะนำและกระบวนการตรวจสอบวิ่งและสามารถมองเห็นได้ในภาพที่ผมติดปัญหาคือmsysแปลงไป/c คำตอบคือการหลบหนีมันและเรียกใช้คำสั่งเป็นc:\ cmd //c mklink
Mihai Rotaru

คำตอบ:


14
  1. ค้นหา% PATH% ของคุณเพื่อหา cmd.cmd หรือ cmd.bat พวกเขาอาจรบกวน cmd ของคุณ

  2. เรียกใช้กระบวนการตรวจสอบcmd /c mklinkและดำเนินการของคุณ ตรวจสอบบันทึก ProcMon สำหรับคำสั่งที่ดำเนินการจริง ๆ


26
การตรวจสอบกระบวนการช่วยติดตามปัญหา มันmsysจะเปลี่ยน/cเป็นc:\ ; มันจะต้องหลบหนี: cmd //c mklink. วิธีการแปลงเหล่านี้ทำจะมีการอธิบายที่นี่
Mihai Rotaru

1
@MihaiRotaru ความคิดเห็นนี้น่าจะเป็นคำตอบ
laktak

2

win7 / cygwin / bash มีปัญหาเดียวกันวิธีแก้ปัญหาคือเปิด cmd สองครั้งและแปลง slash เป็น backslashes ตามที่ cmd ต้องการ (ตัวอย่าง): 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

การตรวจสอบกระบวนการช่วยติดตามปัญหา มันmsysจะเปลี่ยน/cเป็นc:\; มันจะต้องหลบหนี: cmd //c mklink. วิธีการแปลงเหล่านี้ทำจะมีการอธิบายที่นี่ - Mihai Rotaru 1 ม.ค. 56 เวลา 21:32

ฉันไม่สามารถทำสิ่งนี้ได้ตามความเห็นของ Mihaiเพียงอย่างเดียวเพราะเส้นทางยังคงมีเครื่องหมายทับอยู่ข้าง/ในและmklinkบ่นว่านั่น/msys64ไม่ใช่สวิตช์ที่ถูกต้อง

ดังนั้นฉันจึงเขียนชุดสคริปต์เพื่อให้ทำงานได้

นี่คือวิธีที่ฉันเรียกสคริปต์ชุดงานของฉันจาก MSYS:

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

และสคริปต์แบทช์ใช้สองพา ธ เหล่านั้นแล้วแปลง/เป็น\โดยใช้:OLD=NEWไวยากรณ์การขยายพารามิเตอร์สำหรับการแทนที่สตริง 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ซึ่งคล้ายกับ${PARAM:/OLD/NEW}ไวยากรณ์ของ bash สำหรับผู้ที่คุ้นเคย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.