Có thể sử dụng tập lệnh shell trong thư mục sendto không?


8

Tôi muốn sử dụng một tập lệnh bash shell từ SendTothư mục. Khi tôi đặt một phím tắt cho một lô hoặc exe vào SendTothư mục, nó sẽ hiển thị trong Send Tomenu con bối cảnh shell , nhưng khi phím tắt chỉ vào một tập lệnh shell thì không.

Hệ điều hành tôi đang thử nghiệm này là Win7 Home Premium SP1. Tiện ích mở rộng .shđược liên kết với bash.exe của MinGW.

Kịch bản shell của tôi có một .shtiện ích mở rộng và tôi đã thử tách rời .shtiện ích mở rộng (tôi nghĩ rằng MinGW đã thiết lập nó ban đầu, nhưng nó không hoạt động) bằng cách sử dụng tiện ích này và cố gắng liên kết lại để bash bằng cách sử dụng:

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

trong một vỏ cmd quản trị. Mặc dù điều này hoạt động tại một dấu nhắc lệnh và trình bao Explorer (thông qua nhấp đúp chuột), nhưng nó sẽ không hiển thị trong Send Tomenu và nó sẽ không chấp nhận tham số bằng cách kéo trực tiếp một tệp lên trên tập lệnh.

Có ai biết làm thế nào tôi sẽ làm điều này?


1
Explorer có chạy tập lệnh bash shell nếu bạn nhấp đúp vào lối tắt đến tập lệnh shell? Là phím tắt chỉ dành cho tập lệnh shell hay cho bash được tham số hóa với tập lệnh shell?
Werner Henze

phần mở rộng tập tin của tập lệnh là gì? Bạn đã thiết lập một hiệp hội loại tập tin cho loại đó? cửa sổ không thể xử lý dòng bang nếu nó có mặt. bạn đang sử dụng bash-for-windows nào?
Frank Thomas

@FrankThomas: Tôi đã thêm thông tin bổ sung mà bạn yêu cầu vào câu hỏi.
Adrian

@WernerHenze: Nỗ lực kéo tập tin qua một liên kết đến tập lệnh khiến cho một vòng tròn màu đỏ có chữ thập xuất hiện. Cố gắng đặt nó trực tiếp lên tập lệnh cũng không hoạt động ( Move to *dir*vì vậy), vì vậy tôi nghĩ rằng nó không lấy tham số vì một số lý do mặc dù nó được thực thi nếu nhấp đúp vào. Bất cứ ý tưởng tại sao điều này sẽ được như vậy?
Adrian

Tôi không tìm thấy câu trả lời cho câu hỏi thứ hai của Werner Henze, vì vậy theo hướng tương tự: Bạn đã thử sử dụng c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shlàm mục tiêu cho lối tắt trong SendTochưa?
mpy

Câu trả lời:


4

Điều này sẽ cho phép Kéo và Thả vào bất kỳ tập lệnh nào. Bạn có thể đặt một trong số chúng trong thư mục SendTo và sử dụng nó sau đó.

Đăng ký xuất khẩu:

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}"

Phần hex thực sự "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"được mã hóa trong xuất khẩu.

Bạn có thể sẽ muốn xóa readsau khi thử nghiệm, vì vậy bạn có thể viết các tập lệnh chỉ thực hiện một tác vụ mà không để lại một cửa sổ mở. Nếu bạn cần điều này cho các tập lệnh đơn, bạn luôn có thể thêm nó vào phần cuối của chúng.

Sử dụng assoc .ext=ShellFilesau khi nhập để liên kết bất kỳ tiện ích mở rộng tệp nào bạn muốn với chức năng này. DropHandler trong ví dụ này hoạt động cho Windows XP và Windows 7 (có lẽ cũng vậy) và về cơ bản có nghĩa là "chạy lệnh, với tất cả tên tệp bị bỏ làm đối số".

Sử dụng điều này như một tập lệnh ( echotest.ext) để kiểm tra chức năng cơ bản:

echo $0 $*;

+1 để sử dụng sourceloại bỏ việc gọi vỏ khác và trả lời câu hỏi phụ của tôi về kéo và thả. Thật không may, đây không phải là câu hỏi chính, vì vậy thật không may, bạn sẽ không nhận được tiền thưởng. Nhưng cảm ơn. Tôi đã cố gắng để tìm ra điều này mà không thành công. (Y)
Adrian

Điều này sẽ cho phép bạn trực tiếp sử dụng shellscripts trong thư mục SendTo, thay vì tạo liên kết đến bash.exe với tham số của tập lệnh. Tôi thực sự tin rằng câu trả lời này cho câu hỏi của bạn, trong khi câu trả lời được chấp nhận cung cấp một cách giải quyết. Sẽ không tranh luận mặc dù: P
Squeezy

Ồ, thật tốt khi biết. Cảm ơn. Hmmm, không chắc ai sẽ đưa tiền thưởng cho rồi. :(
Adrian

mpy, anh ấy đã giải quyết vấn đề của bạn trước. Tôi chỉ làm việc này ra, vì tò mò. Ngoài ra, tôi không thể ngừng sử dụng SendTo và Kéo và thả vào các tập lệnh kể từ đó, vì vậy đó sẽ là giải thưởng của tôi!
Bóp

+1 cũng từ tôi cho source, đây thực sự là một điểm tốt. @Adrian: Bây giờ bạn đã biết, tại sao SU không cho phép bạn thưởng tiền thưởng quá nhanh. Câu trả lời của IMHO Squeezy xứng đáng nhận được tiền thưởng, bởi vì câu trả lời của anh ấy thanh lịch hơn; nếu bạn cảm thấy tồi tệ về điều đó ;)bạn vẫn có thể chấp nhận câu trả lời của tôi (vì nó cũng giải quyết được vấn đề của bạn), nhưng tôi cũng sẽ ổn với upvote thôi.
mpy

4

Đây là cách chuyển một đối số cho bashhàm shell thông qua SendTo(hoặc thông qua kéo và thả). Như một ví dụ tôi đã sử dụng nội dung echo. Đặt mục tiêu cho liên kết của bạn trong SendTothư mục như sau:

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

Ở đây $0là viết tắt của đối số đầu tiên sau dòng lệnh đã cho a) , tức là tên tệp đầy đủ của tệp mà hành động sendto được thực thi. readgiữ cho cửa sổ mở, để bạn có thể đọc tin nhắn. (Tôi đã thử nghiệm điều này với cygwin's bash, nhưng tôi nghĩ rằng mingw cũng bashnên hoạt động.)

Trong trường hợp của bạn, mục tiêu nên là

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

Bây giờ kịch bản của bạn có thể xử lý tên tệp. Nhưng lưu ý rằng tên tệp được truyền cho tập lệnh làm đối số đầu tiên , vì vậy bên trong tập lệnh, tên tệp được tham chiếu là$1 .


Cuối cùng, nhưng không kém phần quan trọng ở đây là hai ảnh chụp màn hình dưới dạng tóm tắt:

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


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


a) Bạn đã trích dẫn man bash:

-c stringNếu tùy chọn -c có mặt, thì các lệnh được đọc từ chuỗi. Nếu có các đối số sau chuỗi, chúng được gán cho các tham số vị trí, bắt đầu bằng $ 0.

Để hiểu điều đó, hãy sử dụng ví dụ dòng đích sau:

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

Điều này sẽ in This is Foo, trong khi

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

sẽ in This is Baz. Vì vậy, "chuỗi" là tất cả mọi thứ giữa các dấu nháy đơn và Foo Bar Bazlà đối số.


1
Ahhh, đó là những gì có nghĩa là. Làm cho ý nghĩa bây giờ. Cảm ơn bạn. Tôi sẽ thưởng cho bạn tiền thưởng ngay khi SO cho tôi. (nói rằng tôi có thể làm điều đó trong 11 giờ vì một số lý do nhún vai )
Adrian

0

Nếu Windows từ chối liên kết đến tệp .sh, bạn có thể thử sử dụng tệp .bat gọi tập lệnh .sh.

Nếu điều đó không hiệu quả, bạn cũng có thể thử biên dịch .bat thành .exe.
Tìm kiếm nhanh trên google:

Trình biên dịch hàng loạt
Bat-To-exe


Tôi biết rằng tôi có thể sử dụng một dơi proxy hoặc exe. Tôi muốn biết nếu nó có thể được thực hiện mà không cần một proxy như vậy.
Adrian

0

Hãy thử phiên bản cập nhật này của tệp REG (lưu ý tôi sử dụng Windows 7 64 bit; sử dụng System32thay vì SysWOW64nếu bạn có Win7, Vista hoặc XP 32 bit):

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}"

Điều này sẽ cho phép các tập lệnh shell của bạn cũng được chạy như Quản trị viên giống như bất kỳ tệp .bat nào. Nói cách khác, nó làm cho tất cả các tập lệnh shell UAC tương thích khi sử dụng Windows Vista và Windows 7 hoặc 8.

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.