Можно ли использовать скрипт оболочки в папке 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 $*;

+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


Я знаю, что я могу использовать прокси-бит или 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.