8

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

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

4 ответа4

4

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

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

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

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 $*;
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.

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .