Czy można użyć skryptu powłoki w folderze sendto?


9

Chciałbym użyć skryptu powłoki bash z SendTofolderu. Kiedy umieszczam skrót do partii lub pliku exe w SendTofolderze, pojawia się ono w Send Topodmenu kontekstu powłoki , ale gdy skrót wskazuje skrypt powłoki, nie robi tego.

System operacyjny, na którym testuję to jest Win7 Home Premium SP1. Rozszerzenie jest .shskojarzone z plikiem bash.exe programu MinGW.

Mój skrypt powłoki ma .shrozszerzenie i próbowałem odłączyć to .shrozszerzenie (myślę, że MinGW początkowo je skonfigurowało, ale to nie działało) za pomocą tego narzędzia i próbowałem ponownie powiązać je w celu bash, używając:

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

w admin cmd powłoki. Chociaż działa to w wierszu polecenia i powłoce Eksploratora (poprzez podwójne kliknięcie), nie pojawi się w Send Tomenu i nie zaakceptuje parametru, przeciągając plik bezpośrednio na skrypt.

Czy ktoś wie, jak bym to zrobił?


1
Czy Explorer uruchamia skrypt powłoki bash po dwukrotnym kliknięciu skrótu do skryptu powłoki? Czy skrót jest tylko dla skryptu powłoki lub bash sparametryzowany za pomocą skryptu powłoki?
— Werner Henze

jakie jest rozszerzenie pliku skryptu? czy ustanowiłeś powiązanie typu pliku dla tego typu? Windows nie może przetworzyć linii Bang, jeśli jest ona obecna. z którego bash-for-Windows korzystasz?
— Frank Thomas

@FrankThomas: Dodałem dodatkowe informacje, o które prosiłeś, do pytania.
— Adrian

@WernerHenze: Próba przeciągnięcia pliku przez łącze do skryptu powoduje pojawienie się czerwonego koła z krzyżykiem. Próba umieszczenia go bezpośrednio nad skryptem też nie działa (mówi Move to *dir*), więc myślę, że z jakiegoś powodu nie przyjmuje parametrów, mimo że jest wykonywany po dwukrotnym kliknięciu. Wiesz, dlaczego tak by było?
— Adrian

Nie znajduję odpowiedzi na drugie pytanie Wernera Henze, więc w podobnym kierunku: Czy próbowałeś użyć c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shjako celu dla skrótu SendTo?
— mpy

Odpowiedzi:


4

Umożliwi to przeciąganie i upuszczanie do dowolnego skryptu. Możesz umieścić jeden z nich w folderze SendTo i użyć go później.

Eksport rejestru:

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

W rzeczywistości część heksadecymalna jest "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"zakodowana w eksporcie.

Prawdopodobnie będziesz chciał usunąć readpóźniejsze testy, abyś mógł pisać skrypty, które wykonują zadanie bez wychodzenia z otwartego okna. Jeśli potrzebujesz tego dla pojedynczych skryptów, zawsze możesz dodać to dodać ich koniec.

Użyj assoc .ext=ShellFilepo zaimportowaniu, aby połączyć dowolne rozszerzenie pliku z tą funkcją. DropHandler w tym przykładzie działa w systemach Windows XP i Windows 7 (prawdopodobnie także w innych) i zasadniczo oznacza „uruchom polecenie, używając wszystkich usuniętych nazw plików jako argumentów”.

Użyj tego jako skryptu ( echotest.ext) do przetestowania podstawowej funkcjonalności:

echo $0 $*;

+1 za użycie sourceeliminującego wywołanie innej powłoki i odpowiedź na moje boczne pytanie dotyczące przeciągania i upuszczania. Niestety nie jest to główne pytanie, więc niestety nie dostaniesz nagrody. Ale dzięki. Próbowałem to rozgryźć bez powodzenia. (Y)
— Adrian

Umożliwi to bezpośrednie użycie skryptów shellscript w folderze SendTo, zamiast tworzenia łącza do bash.exe z parametrem skryptu. Wierzę, że to odpowiada na twoje pytanie, a zaakceptowana odpowiedź stanowi obejście. Nie będę się jednak kłócić: P
— Squeezy

Och, dobrze wiedzieć. Dzięki. Hmmm, nie jestem pewien, komu dać nagrodę za to. :(
— Adrian

mpy, on pierwszy rozwiązał twój problem. Właśnie to wypracowałem z ciekawości. Od tego czasu nie mogę przestać używać skryptów SendTo oraz Drag & Drop do skryptów, więc to będzie moja nagroda!
— Squeezy

+1 również ode mnie, bo sourceto naprawdę dobry punkt. @Adrian: Teraz już wiesz, dlaczego SU nie pozwolił ci zbyt szybko przyznać nagrody. Odpowiedź IMHO Squeezy'ego zasługuje na nagrodę, ponieważ jego odpowiedź jest bardziej elegancka; jeśli czujesz się źle z tego powodu, ;)nadal możesz zaakceptować moją odpowiedź (ponieważ rozwiązało to również twój problem), ale nie miałbym nic przeciwko, tylko głosowanie.
— mpy

4

Oto jak przekazać argument do bashfunkcji powłoki za pośrednictwem SendTo(lub poprzez przeciąganie i upuszczanie). Jako przykład użyłem wbudowanego echo. Ustaw cel dla swojego łącza w SendTofolderze w następujący sposób:

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

Tutaj $0stoi na pierwszy argument po danej linii poleceń a) , czyli pełną nazwę pliku, w którym sendto działanie zostało wykonane. readutrzymuje otwarte okno, abyś mógł przeczytać wiadomość. (Testowałem to z bashcygwinem, ale myślę, że mingw też bashpowinno działać.)

W twoim przypadku celem powinien być

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

Teraz twój skrypt może przetwarzać nazwę pliku. Należy jednak pamiętać, że nazwa pliku jest przekazywana do skryptu jako pierwszy argument, więc w skrypcie nazwa pliku jest określana jako$1 .


Ostatnie, ale nie mniej ważne, tutaj dwa zrzuty ekranu jako podsumowanie:

wprowadź opis zdjęcia tutaj


wprowadź opis zdjęcia tutaj


a) zacytowałeś man bash:

-c stringJeśli dostępna jest opcja -c, polecenia są odczytywane z łańcucha. Jeśli po ciągu znajdują się argumenty, są one przypisywane do parametrów pozycyjnych, zaczynając od 0 $.

Aby to zrozumieć, użyj np. Następującej linii docelowej:

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

Będzie to wydrukować This is Foo, natomiast

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

wydrukuje This is Baz. Zatem „ciąg znaków” jest wszystkim między apostrofami i Foo Bar Bazjest argumentem.


1
Ahhh, to właśnie to miało znaczyć. Ma to teraz sens. Dziękuję Ci. Przyznam ci nagrodę, gdy tylko SO mi na to pozwoli. (mówi, że mogę to zrobić w 11 godzin z jakiegoś powodu wzruszając ramionami )
— Adrian

0

Jeśli system Windows odmawia połączenia z plikiem .sh, możesz spróbować użyć pliku .bat, który wywołuje skrypt .sh.

Jeśli to nie zadziała, możesz także spróbować skompilować plik .bat do pliku .exe.
Znaleziono szybkie Google:

Kompilator wsadowy
Bat-To-Exe


Wiem, że mogę użyć nietoperza proxy lub exe. Chciałbym wiedzieć, czy można to zrobić bez takiego serwera proxy.
— Adrian

0

Wypróbuj zaktualizowaną wersję pliku REG (uwaga: używam 64-bitowego systemu Windows 7; użyj System32zamiast tego, SysWOW64jeśli masz 32-bitowy system Windows 7 , Vista lub XP):

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

Pozwoli to na uruchamianie skryptów powłoki jako Administrator, podobnie jak każdy plik .bat. Innymi słowy, sprawia, że ​​wszystkie skrypty powłoki UAC są kompatybilne podczas korzystania z systemu Windows Vista i Windows 7 lub 8.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.