Можно ли использовать скрипт оболочки в папке sendto?

1872
Adrian

Я хотел бы использовать скрипт оболочки bash из SendToпапки. Когда я помещаю ярлык в пакет или исполняемый файл в SendToпапку, он отображается в Send Toподменю контекста оболочки, но когда ярлык указывает на скрипт оболочки, это не так.

ОС, на которой я тестирую это Win7 Home Premium SP1. Расширение, .shкоторое было связано с MinGW's bash.exe.

Мой сценарий оболочки имеет .shрасширение, и я попытался отсоединить .shрасширение (я думаю, что MinGW установил его изначально, но это не сработало), используя эту утилиту, и попытался повторно связать его с bash, используя:

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

в командной оболочке администратора. Хотя это работает в командной строке и в оболочке Проводника (с помощью двойного щелчка), оно не будет отображаться в Send Toменю и не будет принимать параметр, перетаскивая файл поверх сценария напрямую.

Кто-нибудь знает, как я это сделаю?

7
Проводит ли Explorer сценарий оболочки bash, если дважды щелкнуть ярлык сценария оболочки? Является ли ярлык только для сценария оболочки или для bash, параметризованного сценарием оболочки? Werner Henze 11 лет назад 1
каково расширение файла скрипта? Вы установили ассоциацию типов файлов для этого типа? Windows не может обработать строку взрыва, если она присутствует. какой bash-for-windows вы используете? Frank Thomas 11 лет назад 0
@FrankThomas: я добавил в вопрос дополнительную информацию, которую вы запросили. Adrian 11 лет назад 0
@WernerHenze: попытка перетащить файл по ссылке на скрипт приводит к появлению красного круга с крестиком. Попытка поместить его непосредственно в сценарий также не работает (говорит `Move to * dir *`), поэтому я думаю, что он не принимает параметры по какой-то причине, даже если он выполняется при двойном нажатии. Есть идеи, почему это так? Adrian 11 лет назад 0
Я не могу найти ответ на второй вопрос Вернера Хенце, поэтому в том же направлении: вы пытались использовать `c: \ MinGW \ msys \ 1.0 \ bin \ bash.exe -c C: \ Path \ To \ Your \ Script.sh` как цель для ярлыка в `SendTo`? mpy 11 лет назад 0
@mpy, WernerHenze: Извините, я думаю, что я предположил, что на 2-й вопрос был выведен ответ с учетом `ftype ShellScript = c: \ MinGW \ msys \ 1.0 \ bin \ bash.exe -c" '% 1'% 2 "`, который показывает передаваемые параметры. Так что да, это для параметризованного сценария оболочки. Adrian 11 лет назад 0
@mpy: Да, я пробовал `c: \ MinGW \ msys \ 1.0 \ bin \ bash.exe -c C: \ Path \ To \ Your \ Script.sh` в качестве цели для ярлыка в` SendTo`, потому что Мне нужно контролировать, как параметры выкладываются в командной строке. `-c` требует, чтобы * единственная строка * передавалась как команда, которую нужно вызвать. Любой пробел, который не указан в кавычках, приводит к тому, что он рассматривается как следующий параметр для bash, а не сценария оболочки. Adrian 11 лет назад 0
(что, кстати, кажется противоречащим странице man: `-c строка Если присутствует опция -c, то команды читаются из строки. Если после строки есть аргументы, они присваиваются позиционным параметрам, начиная с $ 0. `) Adrian 11 лет назад 0
Спасибо @mpy за объяснение, что на самом деле означает эта цитата из man-страницы. Я полностью неверно истолковал, что это значит. Adrian 11 лет назад 0

4 ответа на вопрос

4
mpy

Вот как передать аргумент в функцию bashоболочки с помощью SendTo(или с помощью перетаскивания). В качестве примера я использовал встроенный echo. Установите цель для вашей ссылки в SendToпапке следующим образом:

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

Здесь $0обозначает первый аргумент после заданной командной строки a), то есть полное имя файла, для которого было выполнено действие sendto. readдержит окно открытым, чтобы вы могли прочитать сообщение. (Я проверил это с Cygwin's bash, но я думаю, что Mingw bashдолжен работать тоже.)

В вашем случае цель должна быть

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

Теперь ваш скрипт может обрабатывать имя файла. Но обратите внимание, что имя файла передается сценарию в качестве первого аргумента, поэтому внутри сценария указывается имя файла$1 .


Наконец, что не менее важно, вот два скриншота в качестве резюме:

enter image description here


enter image description here


а) Вы цитировали 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это аргументы.

Ааа, вот что это значит. Имеет смысл сейчас. Спасибо. Я награжу вас за вознаграждение, как только ТАК позволит мне. (говорит, что я могу сделать это за 11 часов по какой-то причине * пожимает плечами *) Adrian 11 лет назад 1
4
Squeezy

Это включит Drag & Drop для любого скрипта. Вы можете поместить один из них в папку 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] @="" 

На самом деле шестнадцатеричная часть "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 11 лет назад 0
Это позволит вам напрямую использовать сценарии оболочки в папке SendTo вместо создания ссылки на bash.exe с параметром сценария. Я действительно считаю, что это отвечает на ваш вопрос, в то время как принятый ответ предоставляет обходной путь. Спорить не собираюсь, хотя: P Squeezy 11 лет назад 0
О, приятно знать. Благодарю. Хм, не уверен, кому дать награду тогда. :( Adrian 11 лет назад 0
mpy, он решил твою проблему первым. Я просто решил это из любопытства. С тех пор я не могу перестать использовать SendTo и Drag & Drop для скриптов, так что это будет моим призом! Squeezy 11 лет назад 0
+1 также от меня за «источник», это действительно хороший момент. @Adrian: Теперь ты знаешь, почему SU не позволил тебе наградить награду слишком быстро. ИМХО Ответ Скузи заслуживает награды, потому что его ответ более элегантный; если вы чувствуете себя плохо из-за этого `;)` вы все еще можете _accept_ мой ответ (поскольку это также решило вашу проблему), но я также был бы согласен только с upvote. mpy 11 лет назад 0
Это так раздражает, когда Windows требует, чтобы текст Unicode вводился через hex (2). :( Какой метод вы используете для кодирования текста в Unicode? Adrian 11 лет назад 0
@ Squeezy, есть ли способ добавить это в подменю «Открыть с помощью»? Таким образом, я мог бы добавить версию «bash debug». Adrian 11 лет назад 0
@ Squeezy, оказывается, что команду open можно добавить с помощью команды `ftype ShellFile = c: \ cygwin \ bin \ bash -c" source \ "$ 0 \"; прочитать ""% 1 "% *`, что является меньшей ошибкой склонный. Также обратите внимание на экранированные и не экранированные кавычки, которые необходимы для гарантии того, что это будет работать с именами файлов с пробелами в них. Adrian 11 лет назад 0
На самом деле команда должна быть `ftype ShellFile = c: \ cygwin \ bin \ bash -c" source \ "$ (/ bin / cygpath $ (/ bin / cygpath -wl \" $ 0 \ ") \") \ "; прочитайте ""% 1 "% *`, так как при этом будет сохранено предупреждающее сообщение о том, что `$ 0` - это путь в стиле MS-DOS, если переменной среды` CYGWIN` не присвоено значение `nodosfilewarning` в системной переменной. Adrian 11 лет назад 0
Да, вы можете добавить команду open через `ftype` (что я и сделал). Но DropHandler в любом случае потребуется волшебство реестра, поэтому я только что разместил полный экспорт здесь. Открыть с помощью должно быть довольно легко, просто добавьте обработчик к файлам и свяжите его с командой, которую вы хотите запустить. В качестве альтернативы вы можете добавить второй обработчик команд и назвать его ** Debug ** righttaway :) Squeezy 11 лет назад 0
Возможно, вам следует добавить что-то вроде «tl; dr» или около того, указывая, что часть, которую люди пропустят, это ключ `ShellEx \ DropHandler`, так как люди с этим вопросом уже будут иметь соответствующую файловую ассоциацию или знают, как сделать Это. (Кроме того, не могли бы вы упростить этот файл `.reg` немного по сравнению с механически экспортированным файлом? Разумеется, нет реальной необходимости * в шестнадцатеричном кодировании UTF-16?) SamB 8 лет назад 0
Не стесняйтесь редактировать ответы и вопросы, если у вас есть какие-либо улучшения. Squeezy 8 лет назад 0
0
harrymc

Если Windows отказывается ссылаться на файл .sh, вы можете попробовать использовать файл .bat, который вызывает скрипт .sh.

Если это не сработает, попробуйте также скомпилировать .bat в .exe.
Быстрый гугл нашел:

Пакетный компилятор
Bat-To-Exe

Я знаю, что я могу использовать прокси-бит или exe. Хотелось бы узнать, можно ли это сделать без такого прокси. Adrian 11 лет назад 0
0
kramlat

Попробуйте эту обновленную версию файла REG (обратите внимание, что я использую 64-битную Windows 7; используйте System32вместо, SysWOW64если у вас 32-битная Win7, Vista или 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"=""  [HKEY_CLASSES_ROOT\ShellFile\shell\runasuser\command] "DelegatExecute"=""  [HKEY_CLASSES_ROOT\ShellFile\ShellEx]  [HKEY_CLASSES_ROOT\ShellFile\ShellEx\DropHandler] @="" 

Это позволит вашим сценариям оболочки запускаться от имени администратора так же, как и любой файл .bat. Другими словами, он делает все сценарии оболочки UAC-совместимыми при использовании Windows Vista и Windows 7 или 8.