เป็นไปได้ไหมที่จะใช้เชลล์สคริปต์ในโฟลเดอร์ sendto


9

ฉันต้องการใช้สคริปต์เชลล์ bash จากSendToโฟลเดอร์ เมื่อฉันใส่ทางลัดไปยังชุดหรือ exe ลงในSendToโฟลเดอร์มันจะปรากฏขึ้นในSend Toเมนูย่อยบริบทของเชลล์แต่เมื่อทางลัดชี้ไปที่เชลล์สคริปต์มันไม่ได้

ระบบปฏิบัติการที่ฉันกำลังทดสอบนี้คือ Win7 Home Premium SP1 ส่วนขยาย.shที่เกี่ยวข้องกับ bash.exe ของ MinGW

เชลล์สคริปต์ของฉันมี.shส่วนขยายและฉันได้ลองยกเลิกการเชื่อมโยง.shส่วนขยาย (ฉันคิดว่า MinGW ตั้งค่าเริ่มต้น แต่ไม่ได้ผล) โดยใช้โปรแกรมอรรถประโยชน์นี้และพยายามเชื่อมโยงอีกครั้งเพื่อทุบตีโดยใช้:

ftype ShellScript=c:\MinGW\msys\1.0\bin\bash.exe -c "'%1' %2"
assoc .sh=ShellScript

ในเชลล์ cmd ของผู้ดูแลระบบ แม้ว่าสิ่งนี้จะทำงานที่พร้อมรับคำสั่งและเชลล์ Explorer (ผ่านการคลิกสองครั้ง) แต่จะไม่แสดงในSend Toเมนูและจะไม่ยอมรับพารามิเตอร์โดยการลากไฟล์ที่ด้านบนของสคริปต์โดยตรง

ไม่มีใครรู้ว่าฉันจะทำเช่นนี้?


1
Explorer รัน bash shell script หรือไม่ถ้าคุณคลิกสองครั้งที่ทางลัดไปยังเชลล์สคริปต์ ทางลัดสำหรับเชลล์สคริปต์หรือสำหรับทุบตีพารามิเตอร์กับเชลล์สคริปต์หรือไม่
เวอร์เนอร์ Henze

นามสกุลไฟล์ของสคริปต์คืออะไร? คุณได้สร้างความสัมพันธ์ประเภทไฟล์สำหรับประเภทนั้นหรือไม่ windows ไม่สามารถประมวลผลบางบรรทัดถ้ามีอยู่ คุณใช้ bash-for-windows รุ่นใด
Frank Thomas

@FrankThomas: ฉันได้เพิ่มข้อมูลเพิ่มเติมที่คุณต้องการสำหรับคำถาม
Adrian

@WernerHenze: ความพยายามในการลากไฟล์บนลิงก์ไปยังสคริปต์ทำให้เกิดวงกลมสีแดงพร้อมกากบาทปรากฏขึ้น ความพยายามที่จะวางสคริปต์ไว้เหนือสคริปต์ก็ไม่ได้ผล (พูดว่าMove to *dir*) ดังนั้นฉันคิดว่ามันไม่ใช้พารามิเตอร์ด้วยเหตุผลบางอย่างแม้ว่าจะถูกเรียกใช้งานหากคลิกสองครั้ง ความคิดใด ๆ ที่ว่าทำไมถึงเป็นเช่นนั้น?
เอเดรียน

ฉันไม่พบคำตอบสำหรับคำถามที่สองของ Werner Henze ดังนั้นในทิศทางเดียวกัน: คุณพยายามใช้c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shเป็นเป้าหมายสำหรับทางลัดSendToหรือไม่
mpy

คำตอบ:


4

การทำเช่นนี้จะช่วยให้ลาก & วางไปที่สคริปต์ใดก็ได้ คุณสามารถวางหนึ่งในนั้นในโฟลเดอร์ SendTo และใช้มันในภายหลัง

การส่งออกรีจิสทรี:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\ShellFile]

[HKEY_CLASSES_ROOT\ShellFile\Shell]

[HKEY_CLASSES_ROOT\ShellFile\Shell\Open]

[HKEY_CLASSES_ROOT\ShellFile\Shell\Open\Command]
@=hex(2):43,00,3a,00,5c,00,70,00,61,00,74,00,68,00,5f,00,65,00,78,00,74,00,5c,\
  00,62,00,61,00,73,00,68,00,2e,00,65,00,78,00,65,00,20,00,2d,00,63,00,20,00,\
  22,00,73,00,6f,00,75,00,72,00,63,00,65,00,20,00,24,00,30,00,3b,00,72,00,65,\
  00,61,00,64,00,22,00,20,00,25,00,31,00,20,00,25,00,2a,00,00,00

[HKEY_CLASSES_ROOT\ShellFile\ShellEx]

[HKEY_CLASSES_ROOT\ShellFile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

ส่วนฐานสิบหกที่แท้จริงคือการ"C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"เข้ารหัสในการส่งออก

คุณอาจต้องการลบreadหลังจากการทดสอบเพื่อให้คุณสามารถเขียนสคริปต์ที่เพิ่งทำงานโดยไม่ต้องออกจากหน้าต่างที่เปิดอยู่ หากคุณต้องการสิ่งนี้สำหรับสคริปต์เดี่ยวคุณสามารถเพิ่มมันเพิ่มในส่วนท้ายได้

ใช้assoc .ext=ShellFileหลังจากนำเข้าเพื่อลิงก์ไฟล์นามสกุลใด ๆ ที่คุณต้องการด้วยฟังก์ชั่นนี้ DropHandler ในตัวอย่างนี้ใช้ได้กับ Windows XP และ Windows 7 (อาจเป็นอย่างอื่น) และโดยทั่วไปหมายถึง "เรียกใช้คำสั่งด้วยชื่อไฟล์ที่ถูกทิ้งทั้งหมดเป็นอาร์กิวเมนต์"

ใช้สิ่งนี้เป็นสคริปต์ ( echotest.ext) เพื่อทดสอบการทำงานขั้นพื้นฐาน:

echo $0 $*;

+1 สำหรับการใช้sourceกำจัดการร้องขอของเชลล์อื่นและตอบคำถามด้านข้างของฉันเกี่ยวกับการลากและวาง น่าเสียดายที่มันไม่ใช่คำถามหลักดังนั้นน่าเสียดายที่คุณจะไม่ได้รับรางวัล แต่ขอบคุณ. ฉันพยายามคิดออกโดยไม่ประสบความสำเร็จ (Y)
Adrian

สิ่งนี้จะอนุญาตให้คุณใช้ shellscripts โดยตรงในโฟลเดอร์ SendTo แทนที่จะสร้างลิงก์ไปยัง bash.exe ด้วยพารามิเตอร์ของสคริปต์ ฉันเชื่อว่านี่เป็นคำตอบสำหรับคำถามของคุณในขณะที่คำตอบที่ได้รับนั้นเป็นวิธีแก้ปัญหา จะไม่เถียงแม้ว่า: P
Squeezy

โอ้รู้ดี ขอบคุณ อืมไม่แน่ใจว่าใครจะมอบรางวัลให้ :(
เอเดรียน

mpy เขาแก้ไขปัญหาของคุณก่อน ฉันเพิ่งทำสิ่งนี้ออกมาจากความอยากรู้ นอกจากนี้ฉันไม่สามารถหยุดใช้ SendTo และลากและวางเพื่อสคริปต์นับตั้งแต่นั้นจะเป็นรางวัลของฉัน!
Squeezy

+1 จากฉันสำหรับsourceนี่เป็นจุดที่ดีจริงๆ @ เอเดรีย: ตอนนี้คุณรู้ว่าทำไม SU ไม่ให้คุณได้รับรางวัลเร็วเกินไป คำตอบของ IMHO Squeezy สมควรได้รับรางวัลเพราะคำตอบของเขานั้นสง่างามกว่า ถ้าคุณรู้สึกไม่ดีเกี่ยวกับว่า;)คุณยังสามารถยอมรับคำตอบของฉัน (เพราะมันแก้ปัญหาของคุณด้วย) แต่ฉันก็จะดีกับ upvote เท่านั้น
mpy

4

นี่คือวิธีการส่งผ่านอาร์กิวเมนต์ไปยังbashฟังก์ชันเชลล์ผ่านSendTo(หรือผ่านการลากและวาง) เป็นตัวอย่างที่ผมใช้ echobuiltin กำหนดเป้าหมายสำหรับลิงก์ของคุณในSendToโฟลเดอร์ดังต่อไปนี้:

C:\cygwin\bin\bash.exe -c "echo Argument: $0; read"

ที่นี่$0หมายถึงอาร์กิวเมนต์แรกหลังจากบรรทัดคำสั่งที่กำหนดก)คือชื่อไฟล์แบบเต็มของไฟล์ที่ดำเนินการ sendto readเปิดหน้าต่างค้างไว้เพื่อให้คุณสามารถอ่านข้อความ (ฉันทดสอบสิ่งนี้กับของ cygwin bashแต่ฉันคิดว่า mingw ก็bashควรใช้ได้เช่นกัน)

ในกรณีของคุณเป้าหมายควรเป็น

c:\MinGW\msys\1.0\bin\bash.exe -c "/path/to/your/script.sh $0; read"

ตอนนี้สคริปต์ของคุณสามารถประมวลผลชื่อไฟล์ได้ แต่ทราบว่าชื่อไฟล์จะถูกส่งผ่านไปยังสคริปต์เป็นครั้งแรกอาร์กิวเมนต์ดังนั้นภายในสคริปต์ชื่อไฟล์ที่มีการอ้างอิงเป็น$1


สุดท้าย แต่ไม่ท้ายสุดที่นี่เป็นภาพหน้าจอสองภาพสรุป

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


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


a)คุณยกมาman bash:

-c stringหากมีอ็อพชัน -c อยู่คำสั่งจะอ่านจากสตริง หากมีข้อโต้แย้งหลังจากสตริงพวกเขาจะถูกกำหนดให้กับพารามิเตอร์ตำแหน่งเริ่มต้นด้วย $ 0

เพื่อให้เข้าใจว่าใช้เช่นบรรทัดเป้าหมายต่อไปนี้:

C:\cygwin\bin\bash.exe -c "echo This is $0; read" Foo Bar Baz

นี้จะพิมพ์This is Fooในขณะที่

C:\cygwin\bin\bash.exe -c "echo This is $2; read" Foo Bar Baz

This is Bazจะพิมพ์ ดังนั้น "สตริง" คือทุกสิ่งระหว่างอะพอสโทรฟีและFoo Bar Bazเป็นข้อโต้แย้ง


1
Ahhh นั่นคือสิ่งที่ตั้งใจ ทำให้รู้สึกตอนนี้ ขอบคุณ. ฉันจะมอบรางวัลให้คุณทันทีที่จะให้ฉัน (บอกว่าฉันสามารถทำได้ใน 11 ชั่วโมงด้วยเหตุผลบางอย่างยัก )
เอเดรียน

0

หาก Windows ปฏิเสธที่จะเชื่อมโยงไปยังไฟล์. sh คุณอาจลองใช้ไฟล์. bat ที่เรียกใช้สคริปต์. sh

หากวิธีนี้ใช้ไม่ได้ผลคุณอาจลองรวบรวม. bat ลงใน. exe
พบ Google ด่วน:

แบทช์คอมไพเลอร์
Bat-To-Exe


ฉันรู้ว่าฉันสามารถใช้ proxy bat หรือ exe ฉันอยากจะรู้ว่ามันสามารถทำได้โดยไม่ต้องพร็อกซี่ดังกล่าว
Adrian

0

ลองใช้ไฟล์ REG รุ่นที่อัปเดตนี้ (โปรดทราบว่าฉันใช้ 64-bit Windows 7 ใช้System32แทนSysWOW64หากคุณมี Win7, Vista หรือ XP 32- บิต):

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\ShellFile]
@="Shell Script"

[HKEY_CLASSES_ROOT\ShellFile\DefaultIcon]
@="C:Windows\\SysWOW64\\imageres.dll,-68"

[HKEY_CLASSES_ROOT\ShellFile\shell]

[HKEY_CLASSES_ROOT\ShellFile\shell\edit]

[HKEY_CLASSES_ROOT\ShellFile\shell\edit\command]
@="C:\\Windows\\SysWOW64\\NOTEPAD.EXE %1"

[HKEY_CLASSES_ROOT\ShellFile\shell\open]
"EditFlags"=hex:00,00,00,00

[HKEY_CLASSES_ROOT\ShellFile\shell\open\command]
@="C:\\MinGW\\msys\\1.0\\bin\\bash.exe -c \"source $0;\" \"%1 %*\""

[HKEY_CLASSES_ROOT\ShellFile\shell\print]

[HKEY_CLASSES_ROOT\ShellFile\shell\print\command]
@="C:\\Windows\\SysWOW64\\NOTEPAD.EXE /p %1"

[HKEY_CLASSES_ROOT\ShellFile\shell\runas]
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\ShellFile\shell\runas\command]
@="C:\\MinGW\\msys\\1.0\\bin\\bash.exe -c \"source $0;\" \"%1 %*\""

[HKEY_CLASSES_ROOT\ShellFile\shell\runasuser]
@="@shell32.dll,-50944"
"Extended"=""
"SuppressionPolicyEx"="{F211AA05-D4DF-4370-A2A0-9F19C09756A7}"

[HKEY_CLASSES_ROOT\ShellFile\shell\runasuser\command]
"DelegatExecute"="{ea72d00e-4960-42fa-ba92-7792a7944c1d}"

[HKEY_CLASSES_ROOT\ShellFile\ShellEx]

[HKEY_CLASSES_ROOT\ShellFile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

สิ่งนี้จะช่วยให้เชลล์สคริปต์ของคุณสามารถทำงานในฐานะผู้ดูแลระบบได้เช่นเดียวกับไฟล์. bat กล่าวอีกนัยหนึ่งมันทำให้เชลล์สคริปต์ทั้งหมดเข้ากันได้กับ UAC เมื่อใช้ Windows Vista และ Windows 7 หรือ 8

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