Я уже некоторое время работаю с решением Dragos и считаю его лучшим, потому что оно исключает необходимость использования «cygpath -u» в ваших сценариях оболочки.
Затем я захотел иметь дополнительные функции, такие как поддержка перетаскивания для файлов .sh и .bash. После нескольких копаний я написал .bat, который связывает файлы .sh и .bash как «bashscript» и активирует для них обработчик перетаскивания в проводнике Windows. Мне пришлось отредактировать команду Драгоса, чтобы он обрабатывал 1 аргумент (путь к элементу, опущенному в сценарии оболочки).
Файл .bat примерно выглядит следующим образом:
echo Registering .sh and .bash files as "bashscript"...
assoc .sh=bashscript
assoc .bash=bashscript
echo.
echo Setting the run command for the file type "bashscript"...
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"'
echo.
echo Activating the drag^&drop capability for "bashscript" files (only 1 dropped item
echo will be passed to the script, multiple items are not supported yet)...
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f
Сценарий "argshandler.sh" в корне Cygwin просто отправляет cygpath первый полученный аргумент и ничего не делает, если его нет (например, если вы просто дважды щелкнете по файлу скрипта):
#!/bin/bash
if [ ! "$1" == "" ]
then
cygpath -u "$1"
fi
Пока все это работает довольно хорошо. Тем не менее, есть некоторые недостатки, которые было бы неплохо устранить:
- Команда Dragos и моя производная от нее терпят неудачу, когда дело доходит до сценариев, которые расположены на путях UNC, например \\ MyServer \ MyShare \ scriptfile.sh
- Только 1 отброшенный предмет будет передан в скрипт оболочки.
Каким-то образом, что касается проблемы 1-drop-item-only, изменение сценария обработчика аргумента для возврата что-то вроде
"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"
и изменение установщика команды Dragos на что-то вроде
...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'
(обратите внимание, что "" вокруг части argshandler.sh пропало), похоже, не работает должным образом: если некоторые элементы, перетаскиваемые в сценарий, содержат пробелы в пути, указанные пути будут разбиты на несколько аргументов на пробелах, хотя каждый из них заключен в двойные кавычки ... странно.
Есть ли профессионалы командной строки, которые решили решить одну или обе эти проблемы?