Kann ein Shellskript im sendto-Ordner verwendet werden?

1911
Adrian

Ich möchte ein Bash-Shell-Skript aus dem SendToOrdner verwenden. Wenn ich eine Verknüpfung zu einem Stapel oder Exe in den SendToOrdner Send Tostecke, wird sie im Shell- Kontext-Untermenü angezeigt, aber wenn die Verknüpfung auf ein Shell-Skript zeigt, ist dies nicht der Fall.

Das Betriebssystem, auf dem ich dies teste, ist Win7 Home Premium SP1. Die Erweiterung ist .shmit MinGWs bash.exe verbunden.

Mein Shell-Skript hat eine .shErweiterung, und ich habe versucht, die .shErweiterung zu trennen (ich denke, MinGW hat es anfangs eingerichtet, aber das hat nicht funktioniert), dieses Hilfsprogramm verwendet und versucht, es mit Hilfe von bash neu zu verknüpfen:

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

in einer Admin-Cmd-Shell. Dies funktioniert zwar an einer Eingabeaufforderung und der Explorer-Shell (per Doppelklick), wird jedoch nicht im Send ToMenü angezeigt und es akzeptiert keinen Parameter, indem eine Datei direkt über das Skript gezogen wird.

Weiß jemand, wie ich das machen würde?

7
Führt Explorer das Bash-Shell-Skript aus, wenn Sie auf die Verknüpfung mit dem Shell-Skript doppelklicken? Ist die Verknüpfung nur für das Shell-Skript oder für Bash mit dem Shell-Skript parametrisiert? Werner Henze vor 10 Jahren 1
Was ist die Dateierweiterung des Skripts? Haben Sie eine Dateitypzuordnung für diesen Typ eingerichtet? Windows kann die Knalllinie nicht verarbeiten, wenn sie vorhanden ist. welche bash-for-windows verwendest du? Frank Thomas vor 10 Jahren 0
@FrankThomas: Ich habe der Frage die zusätzlichen Informationen hinzugefügt, die Sie angefordert haben. Adrian vor 10 Jahren 0
@WernerHenze: Beim Versuch, eine Datei über einen Link zum Skript zu ziehen, wird ein roter Kreis mit Kreuz angezeigt. Der Versuch, das Skript direkt über das Skript zu legen, funktioniert ebenfalls nicht (z. B. "Verschieben in * dir *"). Ich denke also, dass es aus irgendeinem Grund keine Parameter übernimmt, obwohl es ausgeführt wird, wenn auf es doppelt geklickt wird. Irgendeine Idee, warum das so wäre? Adrian vor 10 Jahren 0
Ich finde die Antwort auf die zweite Frage von Werner Henze nicht, also in die gleiche Richtung: Haben Sie versucht, c: \ MinGW \ msys \ 1.0 \ bin \ bash.exe -c C: \ Pfad \ To \ Your \ zu verwenden Script.sh als Ziel für die Verknüpfung in `SendTo`? mpy vor 10 Jahren 0
@mpy, WernerHenze: Entschuldigung, ich glaube, ich habe angenommen, dass die zweite Frage eine abgeleitete Antwort hatte: ftype ShellScript = c: \ MinGW \ msys \ 1.0 \ bin \ bash.exe -c "'% 1'% 2" `welche zeigt die übergebenen Parameter. Also ja, es ist für ein parametrisiertes Shell-Skript. Adrian vor 10 Jahren 0
@mpy: Ja, ich hatte versucht `c: \ MinGW \ msys \ 1.0 \ bin \ bash.exe -c C: \ Pfad \ To \ Your \ Script.sh` als Ziel für die Verknüpfung in` SendTo` ist da Ich muss kontrollieren, wie die Parameter in der Befehlszeile angeordnet sind. Für '-c' muss ein * einzelner String * als aufrufender Befehl übergeben werden. Alle Whitespaces, die nicht in Anführungszeichen gesetzt sind, werden als der nächste Parameter für bash betrachtet, nicht als Shell-Skript. Adrian vor 10 Jahren 0
(BTW, scheint im Gegensatz zur Manpage zu stehen: `-c string Wenn die Option -c vorhanden ist, werden Befehle aus string gelesen. Wenn hinter dem String Argumente stehen, werden sie den Positionsparametern zugewiesen, beginnend mit $ 0. `) Adrian vor 10 Jahren 0
Vielen Dank an @mpy für die Erklärung, was dieses Manpage-Zitat eigentlich bedeutet. Ich habe völlig falsch verstanden, was es bedeutete. Adrian vor 10 Jahren 0

4 Antworten auf die Frage

4
mpy

So übergeben Sie ein Argument an eine bashShell-Funktion SendTo(oder per Drag & Drop). Als Beispiel habe ich das eingebaute verwendet echo. Legen Sie das Ziel für den Link im SendToOrdner wie folgt fest:

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

Hier $0steht für das erste Argument nach der gegebenen Befehlszeile a), dh der vollständige Dateiname der Datei, in der die sendto-Aktion ausgeführt wurde. readhält das Fenster offen, damit Sie die Nachricht lesen können. (Ich habe das mit cygwin's getestet bash, aber ich denke, dass mingw's auch bashfunktionieren sollte.)

In Ihrem Fall sollte das Ziel sein

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

Jetzt kann Ihr Skript den Dateinamen verarbeiten. Beachten Sie jedoch, dass der Dateiname als erstes Argument an das Skript übergeben wird$1 . Innerhalb des Skripts wird auf den Dateinamen verwiesen .


Zum Schluss noch zwei Screenshots als Zusammenfassung:



a) Sie haben zitiert man bash:

-c stringWenn die Option -c vorhanden ist, werden Befehle aus string gelesen. Wenn nach der Zeichenfolge Argumente vorhanden sind, werden diese den Positionsparametern zugewiesen, beginnend mit $ 0.

Um dies zu verstehen, verwenden Sie zB die folgende Zielzeile:

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

Dies wird gedruckt This is Foo, während

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

wird drucken This is Baz. Die "Zeichenfolge" ist also alles zwischen den Apostrophen und Foo Bar Bazdie Argumente.

Ahhh, das bedeutete das. Macht jetzt Sinn. Vielen Dank. Ich werde dir die Prämie zukommen lassen, sobald SO mich lässt. (sagt, dass ich es aus irgendeinem Grund in 11 Stunden schaffen kann * Achselzucken *) Adrian vor 10 Jahren 1
4
Squeezy

Dadurch wird Drag & Drop für jedes Skript aktiviert. Sie können einen von ihnen im SendTo-Ordner ablegen und anschließend verwenden.

Registry-Export:

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] @="" 

Der Hex-Teil ist eigentlich "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"der, der beim Export verschlüsselt wird.

Wahrscheinlich möchten Sie das readnach dem Testen entfernen, sodass Sie Skripts schreiben können, die lediglich eine Aufgabe ausführen, ohne ein geöffnetes Fenster zu verlassen. Wenn Sie dies für einzelne Skripte benötigen, können Sie es immer hinzufügen und am Ende hinzufügen.

Verwenden Sie assoc .ext=ShellFilenach dem Importieren, um eine beliebige Dateierweiterung mit dieser Funktionalität zu verknüpfen. Der DropHandler in diesem Beispiel funktioniert für Windows XP und Windows 7 (wahrscheinlich auch andere) und bedeutet im Wesentlichen "den Befehl mit allen abgelegten Dateinamen als Argumenten ausführen".

Verwenden Sie dies als Skript ( echotest.ext), um die grundlegende Funktionalität zu testen:

echo $0 $*; 
+1 für die Verwendung von "source", wodurch das Aufrufen einer anderen Shell entfällt und die nebenstehende Frage zu Drag & Drop beantwortet wird. Leider ist dies nicht die Hauptfrage, daher bekommen Sie leider keine Prämie. Aber danke. Ich habe versucht, dies ohne Erfolg herauszufinden. (Y) Adrian vor 10 Jahren 0
Auf diese Weise können Sie Shellscripts direkt im SendTo-Ordner verwenden, anstatt mit den Parametern des Skripts eine Verknüpfung zu bash.exe zu erstellen. Ich glaube wirklich, dass dies Ihre Frage beantwortet, während die akzeptierte Antwort einen Workaround bietet. Ich werde aber nicht streiten: P Squeezy vor 10 Jahren 0
Oh, gut zu wissen. Vielen Dank. Hmmm, ich bin mir nicht sicher, wem ich die Belohnung geben soll. :( Adrian vor 10 Jahren 0
mpy, er hat dein Problem zuerst gelöst. Ich habe das aus Neugierde herausgefunden. Ich kann auch nicht mehr damit aufhören, SendTo und Drag & Drop für Skripte zu verwenden, so dass dies mein Preis sein wird! Squeezy vor 10 Jahren 0
+1 auch von mir für 'source', das ist wirklich ein guter Punkt. @Adrian: Jetzt weißt du, warum SU dich nicht zu schnell mit der Prämie belohnt hat. IMHO Squeezys Antwort verdient die Belohnung, weil seine Antwort eleganter ist; wenn Sie sich schlecht fühlen, können Sie immer noch meine Antwort annehmen (da sich auch Ihr Problem gelöst hat), aber ich würde auch nur mit Befürwortung zufrieden sein. mpy vor 10 Jahren 0
Es ist so ärgerlich, wie Windows verlangt, dass der Unicode-Text über Hex (2) eingefügt werden muss. :( Mit welcher Methode kodieren Sie Ihren Unicode-Text? Adrian vor 10 Jahren 0
@Squeezy, gibt es eine Möglichkeit, dies zum Untermenü "Öffnen mit" hinzuzufügen? Auf diese Weise konnte ich eine "bash debug" version hinzufügen. Adrian vor 10 Jahren 0
@Squeezy, es stellt sich heraus, dass der Befehl "Öffnen" mit dem Befehl `ftype ShellFile = c: \ cygwin \ bin \ bash -c" source "" $ 0 "hinzugefügt werden kann; lesen Sie" "% 1"% * ", wodurch weniger Fehler auftreten anfällig. Beachten Sie auch die Escape- und Nicht-Escape-Anführungszeichen, die erforderlich sind, um sicherzustellen, dass dies mit Dateinamen mit Leerzeichen funktioniert. Adrian vor 10 Jahren 0
Eigentlich sollte der Befehl Folgendes sein: ftype ShellFile = c: \ cygwin \ bin \ bash -c "source" "$ (/ bin / cygpath $ (/ bin / cygpath -wl \" $ 0 \ ") \") \ "; Lesen Sie ""% 1 "% *`, da die Warnmeldung angezeigt wird, dass "$ 0" ein MS-DOS-Pfad ist, sofern der Umgebungsvariable "CYGWIN" nicht der Wert "nodosfilewarning" in der Systemvariablen zugewiesen wird. Adrian vor 10 Jahren 0
Ja, Sie können den offenen Befehl über "ftype" hinzufügen (was ich auch tat). Aber der DropHandler wird ohnehin Registrierungsmagie brauchen, deshalb habe ich hier den vollständigen Export veröffentlicht. Das Öffnen mit sollte ziemlich einfach sein. Fügen Sie einfach einen Handler zu den Dateien hinzu und verknüpfen Sie ihn mit dem Befehl, den Sie ausführen möchten. Alternativ können Sie einen zweiten Befehls-Handler hinzufügen und ihn gleich ** Debug ** benennen :) Squeezy vor 10 Jahren 0
Vielleicht sollten Sie eine Art "tl; dr" oder so hinzufügen, wobei darauf hingewiesen wird, dass der Teil, den die Benutzer vermisst haben, der `ShellEx \ DropHandler'-Schlüssel ist, da Personen mit dieser Frage entweder bereits über die entsprechende Dateizuordnung verfügen oder wissen, wie sie erstellt werden es. (Könnten Sie die `.reg'-Datei auch ein wenig von der mechanisch exportierten Datei vereinfachen? Sicherlich gibt es keine * Notwendigkeit * für die hex-kodierte UTF-16-Formatierung?) SamB vor 8 Jahren 0
Fühlen Sie sich frei, Antworten und Fragen zu bearbeiten, wenn Sie Verbesserungen haben. Squeezy vor 8 Jahren 0
0
harrymc

Wenn Windows sich weigert, eine Verknüpfung zu einer .sh-Datei herzustellen, versuchen Sie möglicherweise, eine .bat-Datei zu verwenden, die das Skript .sh aufruft.

Wenn das nicht funktioniert, können Sie auch versuchen, die .bat-Datei in eine .exe-Datei zu kompilieren.
Ein schneller Google gefunden:

Batch-Compiler
Bat-To-Exe

Ich weiß, dass ich einen Proxy-Schläger oder ein Exe verwenden kann. Ich würde gerne wissen, ob dies ohne einen solchen Proxy möglich ist. Adrian vor 10 Jahren 0
0
kramlat

Versuchen Sie es mit dieser aktualisierten Version der REG-Datei (Hinweis: Ich verwende 64-Bit-Windows 7; System32anstelle von SysWOW6432-Bit-Win7, Vista oder 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"=""  [HKEY_CLASSES_ROOT\ShellFile\shell\runasuser\command] "DelegatExecute"=""  [HKEY_CLASSES_ROOT\ShellFile\ShellEx]  [HKEY_CLASSES_ROOT\ShellFile\ShellEx\DropHandler] @="" 

Auf diese Weise können Ihre Shell-Skripts genauso wie jede BAT-Datei als Administrator ausgeführt werden. Mit anderen Worten, es macht alle Shell-Skripts UAC-kompatibel, wenn Sie Windows Vista und Windows 7 oder 8 verwenden.