¿Es posible usar un script de shell en la carpeta sendto?

8

Me gustaría usar un script de shell bash de la SendTocarpeta. Cuando pongo un acceso directo a un lote o exe en la SendTocarpeta, aparece en el Send Tosubmenú de contexto de shell , pero cuando el acceso directo apunta a un script de shell, no lo hace.

El sistema operativo en el que estoy probando esto es Win7 Home Premium SP1. La extensión es la .shque se ha asociado con bash.exe de MinGW.

Mi script de shell tiene una .shextensión y he intentado desasociar la .shextensión (creo que MinGW la configuró inicialmente, pero eso no funcionó) usando esta utilidad e intenté asociarla a bash usando:

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

en un administrador cmd shell. Aunque esto funciona en un símbolo del sistema y el shell del Explorador (mediante doble clic), no aparecerá en el Send Tomenú y no aceptará un parámetro arrastrando un archivo directamente sobre el script.

¿Alguien sabe cómo haría esto?

Adrian
fuente
1
¿Explorer ejecuta el script de shell bash si hace doble clic en el acceso directo al script de shell? ¿El acceso directo es solo para el script de shell o para bash parametrizado con el script de shell?
Werner Henze
¿Cuál es la extensión del archivo del script? ¿ha establecido una asociación de tipo de archivo para ese tipo? Windows no puede procesar la línea de explosión si está presente. ¿Qué bash-for-windows estás usando?
Frank Thomas
@FrankThomas: agregué la información adicional que solicitó a la pregunta.
Adrian
@WernerHenze: un intento de arrastrar un archivo sobre un enlace al script hace que aparezca un círculo rojo con una cruz. Intentar ponerlo directamente sobre el script tampoco funciona (dice Move to *dir*), así que estoy pensando que no está tomando parámetros por alguna razón, aunque se ejecute si se hace doble clic en él. ¿Alguna idea de por qué esto sería así?
Adrian
No encuentro la respuesta a la segunda pregunta de Werner Henze, así que en la misma dirección: ¿Intentaste usarlo c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shcomo objetivo para el atajo SendTo?
mpy

Respuestas:

4

Esto permitirá arrastrar y soltar cualquier script. Puede colocar uno de ellos en la carpeta SendTo y usarlo después.

Exportación de registro:

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}"

La parte hexadecimal es la "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"que se codifica en la exportación.

Probablemente querrá eliminar las readpruebas posteriores, para poder escribir scripts que solo realicen una tarea sin salir de una ventana abierta. Si necesita esto para scripts individuales, siempre puede agregarlo y agregar su final.

Use assoc .ext=ShellFiledespués de importar para vincular cualquier extensión de archivo que desee con esta funcionalidad. El DropHandler en este ejemplo funciona para Windows XP y Windows 7 (probablemente también para otros) y básicamente significa "ejecutar el comando, con todos los nombres de archivo descartados como argumentos".

Use esto como un script ( echotest.ext) para probar la funcionalidad básica:

echo $0 $*;
Apretujado
fuente
+1 por usar la sourceeliminación de la invocación de otro shell y responder mi pregunta secundaria sobre arrastrar y soltar. Desafortunadamente, no es la pregunta principal, por lo que desafortunadamente no obtendrá la recompensa. Pero gracias. Traté de resolver esto sin éxito. (Y)
Adrian
Esto le permitirá usar directamente shellscripts en la carpeta SendTo, en lugar de crear un enlace a bash.exe con el parámetro del script. De hecho, creo que esto responde a su pregunta, mientras que la respuesta aceptada proporciona una solución alternativa. Sin embargo, no voy a discutir: P
Squeezy
Oh, es bueno saberlo. Gracias. Hmmm, no estoy seguro de a quién darle la recompensa. :(
Adrian
Mpy, él resolvió tu problema primero. Acabo de resolver esto, por curiosidad. Además, no puedo dejar de usar SendTo y Drag & Drop to scripts desde entonces, ¡ese será mi premio!
Squeezy
+1 también de mi parte source, este es realmente un buen punto. @Adrian: Ahora ya sabes, por qué SU no te permitió otorgar la recompensa demasiado rápido. En mi humilde opinión, la respuesta de Squeezy merece la recompensa, porque su respuesta es más elegante; si te sientes mal por eso ;), aún puedes aceptar mi respuesta (ya que también resolvió tu problema), pero también estaría bien solo con el voto positivo.
mpy
4

Aquí se explica cómo pasar un argumento a una bashfunción de shell mediante SendTo(o mediante arrastrar y soltar). Como ejemplo utilicé el incorporado echo. Establezca el objetivo para su enlace en la SendTocarpeta de la siguiente manera:

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

Aquí $0representa el primer argumento después de la línea de comando dada a) , es decir, el nombre de archivo completo del archivo en el que se ejecutó la acción sendto. readmantiene la ventana abierta para que pueda leer el mensaje. ( bashProbé esto con cygwin's , pero creo que los mingw también bashdeberían funcionar).

En su caso, el objetivo debe ser

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

Ahora su script puede procesar el nombre del archivo. Pero tenga en cuenta que el nombre de archivo se pasa al script como primer argumento, por lo que dentro del script se hace referencia al nombre de archivo como$1 .


Por último, pero no menos importante, aquí hay dos capturas de pantalla como resumen:

ingrese la descripción de la imagen aquí


ingrese la descripción de la imagen aquí


a) Usted citó man bash:

-c stringSi la opción -c está presente, los comandos se leen de la cadena. Si hay argumentos después de la cadena, se asignan a los parámetros posicionales, comenzando con $ 0.

Para entender eso, use, por ejemplo, la siguiente línea de destino:

C:\cygwin\bin\bash.exe -c "echo This is $0; read" Foo Bar Baz

Esto imprimirá This is Foo, mientras

C:\cygwin\bin\bash.exe -c "echo This is $2; read" Foo Bar Baz

imprimirá This is Baz. Entonces la "cadena" es todo entre los apóstrofes, y Foo Bar Bazson los argumentos.

mpy
fuente
1
Ahhh, eso es lo que eso significaba. Tiene sentido ahora. Gracias. Te otorgaré la recompensa tan pronto como SO me lo permita. (dice que puedo hacerlo en 11 horas por alguna razón encogerse de hombros )
Adrian
0

Si Windows se niega a vincular a un archivo .sh, tal vez podría intentar usar un archivo .bat que invoque el script .sh.

Si eso no funciona, también puede intentar compilar el .bat en .exe.
Un google rápido encontrado:

Compilador de lotes
Bat-To-Exe

harrymc
fuente
Sé que puedo usar un proxy bat o exe. Me gustaría saber si se puede hacer sin ese proxy.
Adrian
0

Pruebe esta versión actualizada del archivo REG (tenga en cuenta que uso Windows 7 de 64 bits; use en System32lugar de SysWOW64si tiene Win7, Vista o XP de 32 bits):

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}"

Esto permitirá que sus scripts de shell también se ejecuten como administrador, al igual que cualquier archivo .bat. En otras palabras, hace que todos los scripts de shell sean compatibles con UAC cuando se usa Windows Vista y Windows 7 u 8.

kramlat
fuente