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

9

Я хотел бы использовать скрипт оболочки 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меню и не будет принимать параметр, перетаскивая файл поверх сценария напрямую.

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

Адриан
источник
1
Проводит ли Explorer сценарий оболочки bash, если дважды щелкнуть ярлык сценария оболочки? Является ли ярлык только для сценария оболочки или для bash, параметризованного сценарием оболочки?
Вернер Хенце
каково расширение файла скрипта? Вы установили ассоциацию типов файлов для этого типа? Windows не может обработать строку взрыва, если она присутствует. какой bash-for-windows вы используете?
Фрэнк Томас
@FrankThomas: я добавил в вопрос дополнительную информацию, которую вы запросили.
Адриан
@WernerHenze: попытка перетащить файл по ссылке на скрипт приводит к появлению красного круга с крестиком. Попытка поместить его непосредственно в сценарий также не работает (говорит Move to *dir*), поэтому я думаю, что он не принимает параметры по какой-то причине, даже если он выполняется при двойном щелчке. Есть идеи, почему это так?
Адриан
Я не нахожу ответа на второй вопрос Вернера Хенце, поэтому в аналогичном направлении: пытались ли вы использовать c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shв качестве цели для ярлыка в SendTo?
mpy

Ответы:

4

Это включит 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]
@="{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 $*;
Squeezy
источник
+1 за использование sourceисключения вызова другой оболочки и ответа на мой вопрос о перетаскивании. К сожалению, это не главный вопрос, поэтому, к сожалению, вы не получите награду. Но спасибо. Я пытался понять это без успеха. (Y)
Адриан
Это позволит вам напрямую использовать сценарии оболочки в папке SendTo вместо создания ссылки на bash.exe с параметром сценария. Я действительно считаю, что это отвечает на ваш вопрос, в то время как принятый ответ предоставляет обходной путь. Не собираюсь спорить, хотя: P
Squeezy
О, приятно знать. Спасибо. Хммм, не уверен, кому дать награду тогда. :(
Адриан
mpy, он решил твою проблему первым. Я просто решил это из любопытства. Также я не могу перестать использовать SendTo и Drag & Drop для скриптов с тех пор, так что это будет моим призом!
Squeezy
+1 также от меня source, это действительно хороший момент. @Adrian: Теперь ты знаешь, почему SU не позволил тебе наградить награду слишком быстро. ИМХО Ответ Скузи заслуживает награды, потому что его ответ более элегантный; если вы чувствуете себя плохо из-за этого, ;)вы все равно можете принять мой ответ (поскольку это также решило вашу проблему), но я бы тоже согласился только с upvote.
mpy
4

Вот как передать аргумент в функцию 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 .


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

введите описание изображения здесь


введите описание изображения здесь


а) Вы цитировали 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
Ааа, вот что это значит. Имеет смысл сейчас. Спасибо. Я награжу вас за вознаграждение, как только ТАК разрешит мне. (говорит, что я могу сделать это за 11 часов по какой-то причине пожимание плечами )
Адриан
0

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

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

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

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

Попробуйте эту обновленную версию файла 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"="{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.

kramlat
источник