Est-il possible d'utiliser un script shell dans le dossier sendto?

8

Je voudrais utiliser un script shell bash du SendTodossier. Lorsque je mets un raccourci vers un lot ou un fichier exe dans le SendTodossier, il apparaît dans le Send Tosous-menu contextuel du shell , mais ne le fait pas lorsque le raccourci pointe vers un script shell.

Le système d'exploitation sur lequel je teste ceci est Win7 Home Premium SP1. L'extension est .shassociée à bash.exe de MinGW.

Mon script shell a une .shextension et j'ai essayé de dissocier celle-ci .sh(je pense que MinGW l'a configurée initialement, mais cela n'a pas fonctionné) à l'aide de cet utilitaire et j'ai essayé de la réassocier pour utiliser bash:

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

dans un shell admin cmd. Bien que cela fonctionne avec une invite de commande et le shell Explorer (via un double clic), il n'apparaîtra pas dans le Send Tomenu et n'acceptera pas de paramètre en faisant glisser un fichier directement au-dessus du script.

Est-ce que quelqu'un sait comment je ferais cela?

Adrian
la source
1
Explorer exécute-t-il le script shell bash si vous double-cliquez sur le raccourci vers le script shell? Le raccourci est-il juste pour le script shell ou pour bash paramétré avec le script shell?
Werner Henze
Quelle est l'extension de fichier du script? avez-vous établi une association de type de fichier pour ce type? Windows ne peut pas traiter la ligne si elle est présente. quel bash pour Windows utilisez-vous?
Frank Thomas
@ FrankThomas: J'ai ajouté les informations supplémentaires que vous avez demandées à la question.
Adrian
@WernerHenze: Une tentative de glisser un fichier sur un lien vers le script provoque l'apparition d'un cercle rouge avec une croix. Essayer de le mettre directement sur le script ne fonctionne pas non plus (dit-il Move to *dir*), alors je pense qu'il ne prend pas de paramètres pour une raison quelconque, même s'il est exécuté si vous double-cliquez dessus. Avez-vous une idée du pourquoi?
Adrian
Je ne trouve pas la réponse à la deuxième question de Werner Henze, donc dans le même sens: avez-vous essayé de vous en servir c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shcomme cible pour le raccourci SendTo?
mpy

Réponses:

4

Cela activera le glisser-déposer vers n’importe quel script. Vous pouvez en placer un dans le dossier SendTo et l'utiliser ultérieurement.

Exportation du registre:

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 partie hexadécimale est celle "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"qui est encodée dans l'exportation.

Vous voudrez probablement supprimer les readtests ultérieurs pour pouvoir écrire des scripts qui exécutent une tâche sans laisser de fenêtre ouverte. Si vous en avez besoin pour des scripts uniques, vous pouvez toujours l'ajouter et ajouter leur fin.

À utiliser assoc .ext=ShellFileaprès l’importation pour lier toute extension de fichier souhaitée à cette fonctionnalité. DropHandler, dans cet exemple, fonctionne pour Windows XP et Windows 7 (probablement aussi avec d'autres) et signifie fondamentalement "exécutez la commande, avec tous les noms de fichiers supprimés en tant qu'arguments".

Utilisez ceci comme un script ( echotest.ext) pour tester les fonctionnalités de base:

echo $0 $*;
À presser
la source
+1 pour avoir sourceéliminé l'invocation d'un autre shell et répondu à ma question secondaire sur le glisser-déposer. Malheureusement, ce n'est pas la question principale, donc malheureusement, vous ne recevrez pas la prime. Mais merci. J'ai essayé de comprendre cela sans succès. (Y)
Adrian
Cela vous permettra d'utiliser directement des scripts de shell dans le dossier SendTo, au lieu de créer un lien vers bash.exe avec le paramètre du script. Je pense réellement que cela répond à votre question, alors que la réponse acceptée fournit une solution de contournement. Ne va pas discuter cependant: P
Squeezy
Oh, bon à savoir. Merci. Hmmm, je ne sais pas à qui donner la prime alors. :(
Adrian
mpy, il a d'abord résolu ton problème. Je viens de travailler sur cela, par curiosité. De plus, je ne peux pas arrêter d’utiliser SendTo et Drag & Drop dans les scripts depuis lors, ce sera donc mon prix!
Squeezy
+1 également de ma part source, c’est vraiment un bon point. @Adrian: Vous savez maintenant pourquoi SU ne vous a pas laissé attribuer la prime trop rapidement. La réponse de IMHO Squeezy mérite la prime, car sa réponse est plus élégante; si vous vous sentez mal à propos de cela, ;)vous pouvez toujours accepter ma réponse (car cela résout également votre problème), mais je ne serais pas d'accord non plus.
Mpy
4

Voici comment passer un argument à une bashfonction shell via SendTo(ou via un glisser-déposer). A titre d'exemple, j'ai utilisé le Builtin echo. Définissez la cible de votre lien dans le SendTodossier comme suit:

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

Ici, $0correspond au premier argument après la ligne de commande donnée a) , c'est-à-dire le nom de fichier complet du fichier sur lequel l'action sendto a été exécutée. readlaisse la fenêtre ouverte pour que vous puissiez lire le message. (J'ai testé cela avec cygwin bash, mais je pense que mingw bashdevrait également fonctionner.)

Dans votre cas, la cible devrait être

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

Votre script peut maintenant traiter le nom de fichier. Cependant, notez que le nom de fichier est transmis au script en tant que premier argument; ainsi, dans le script, le nom de fichier est référencé$1 .


Dernier point, mais non le moindre, voici deux captures d'écran en résumé:

entrez la description de l'image ici


entrez la description de l'image ici


a) Vous avez cité man bash:

-c stringSi l'option -c est présente, les commandes sont lues à partir de chaîne. S'il existe des arguments après la chaîne, ils sont affectés aux paramètres de position, en commençant par $ 0.

Pour comprendre cela, utilisez par exemple la ligne cible suivante:

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

Cela va imprimer This is Foo, alors que

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

va imprimer This is Baz. Donc, la "chaîne" est tout ce qui se trouve entre les apostrophes et ce Foo Bar Bazsont les arguments.

mpy
la source
1
Ahhh, c'est ce que cela voulait dire. Cela a du sens maintenant. Je vous remercie. Je vous attribuerai la prime dès que SO me le permettra. (dit que je peux le faire en 11 heures pour une raison quelconque haussement d'épaules )
Adrian
0

Si Windows refuse de créer un lien vers un fichier .sh, vous pouvez peut-être essayer d'utiliser un fichier .bat qui appelle le script .sh.

Si cela ne fonctionne pas, vous pouvez également essayer de compiler le fichier .bat en .exe.
Un rapide google trouvé:

Compilateur batch
Bat-To-Exe

harrymc
la source
Je sais que je peux utiliser une batte proxy ou un exe. Je voudrais savoir si cela peut être fait sans un tel proxy.
Adrian
0

Essayez cette version mise à jour du fichier REG (remarque: j'utilise Windows 7 64 bits; utilisez-le à la System32place de SysWOW64Win7, Vista ou XP 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}"

Cela permettra également d'exécuter vos scripts shell en tant qu'administrateur, comme tout fichier .bat. En d'autres termes, tous les scripts de shell UAC sont compatibles avec Windows Vista et Windows 7 ou 8.

Kramlat
la source