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ł?

Adrian
źródło
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 $*;
Ściśnij
źródło
+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.

mpy
źródło
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

harrymc
źródło
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.

kramlat
źródło