Ist es möglich, ein Shell-Skript im sendto-Ordner zu verwenden?

8

Ich möchte ein Bash-Shell-Skript aus dem SendToOrdner verwenden. Wenn ich eine Verknüpfung zu einem Stapel oder einer Exe in den SendToOrdner lege, wird diese im Send ToUntermenü des Shell- Kontexts angezeigt, aber wenn die Verknüpfung auf ein Shell-Skript verweist, wird dies nicht der Fall sein.

Das Betriebssystem, auf dem ich dies teste, ist Win7 Home Premium SP1. Die Erweiterung .shwurde mit der bash.exe von MinGW verknüpft.

Mein Shell-Skript hat eine .shErweiterung und ich habe versucht, die .shErweiterung mit diesem Dienstprogramm zu trennen (ich glaube, MinGW hat sie ursprünglich eingerichtet, aber das hat nicht funktioniert) und versucht, sie erneut mit bash zu verknüpfen, indem ich :

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 in der Explorer-Shell (per Doppelklick), wird jedoch nicht im Send ToMenü angezeigt und akzeptiert keinen Parameter, indem eine Datei direkt über das Skript gezogen wird.

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

Adrian
quelle
1
Führt der Explorer das Bash-Shell-Skript aus, wenn Sie auf die Verknüpfung zum Shell-Skript doppelklicken? Ist die Verknüpfung nur für das Shell-Skript oder für Bash mit dem Shell-Skript parametrisiert?
Werner Henze
Was ist die Dateierweiterung des Skripts? Haben Sie eine Dateitypzuordnung für diesen Typ eingerichtet? Windows kann die Bang Line nicht verarbeiten, wenn sie vorhanden ist. Welches Bash-for-Windows verwenden Sie?
Frank Thomas
@FrankThomas: Ich habe der Frage die zusätzlichen Informationen hinzugefügt, die Sie angefordert haben.
Adrian
@WernerHenze: Beim Versuch, eine Datei über einen Link zum Skript zu ziehen, wird ein roter Kreis mit einem Kreuz angezeigt. Der Versuch, es direkt über das Skript zu platzieren, funktioniert auch nicht (sagt Move to *dir*), daher denke ich, dass es aus irgendeinem Grund keine Parameter akzeptiert, obwohl es ausgeführt wird, wenn Sie darauf doppelklicken. Irgendeine Idee, warum das so wäre?
Adrian
Ich finde keine Antwort auf die zweite Frage von Werner Henze, also in die ähnliche Richtung: Haben Sie versucht, sie c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shals Ziel für die Verknüpfung zu verwenden SendTo?
Mpy

Antworten:

4

Dadurch wird Drag & Drop für jedes Skript aktiviert. Sie können einen davon in den SendTo-Ordner legen und anschließend verwenden.

Registrierungsexport:

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

Der Hex-Teil ist tatsächlich "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"derjenige, der beim Export codiert wird.

Wahrscheinlich möchten Sie das readnach dem Testen entfernen , damit Sie Skripte schreiben können, die nur eine Aufgabe ausführen, ohne ein offenes Fenster zu verlassen. Wenn Sie dies für einzelne Skripte benötigen, können Sie es jederzeit hinzufügen und deren Ende hinzufügen.

Verwenden assoc .ext=ShellFileSie diese Option nach dem Importieren, um eine beliebige Dateierweiterung mit dieser Funktionalität zu verknüpfen. Der DropHandler in diesem Beispiel funktioniert unter Windows XP und Windows 7 (wahrscheinlich auch unter anderen) und bedeutet im Grunde "Befehl ausführen, wobei alle abgelegten Dateinamen als Argumente dienen".

Verwenden Sie dies als Skript ( echotest.ext), um grundlegende Funktionen zu testen:

echo $0 $*;
Squeezy
quelle
+1 für die sourceBeseitigung des Aufrufs einer anderen Shell und die Beantwortung meiner Nebenfrage zu Drag & Drop. Leider ist es nicht die Hauptfrage, so dass Sie leider nicht das Kopfgeld bekommen. Aber danke. Ich habe versucht, dies ohne Erfolg herauszufinden. (Y)
Adrian
Auf diese Weise können Sie Shellscripts direkt im SendTo-Ordner verwenden, anstatt einen Link zu bash.exe mit dem Parameter des Skripts zu erstellen. Ich glaube tatsächlich, dass dies Ihre Frage beantwortet, während die akzeptierte Antwort eine Problemumgehung bietet. Ich werde aber nicht streiten: P
Squeezy
Oh, gut zu wissen. Vielen Dank. Hmmm, ich bin mir nicht sicher, wem ich das Kopfgeld geben soll. :(
Adrian
mpy, er hat zuerst dein Problem gelöst. Ich habe das nur aus Neugier herausgearbeitet. Außerdem kann ich seitdem nicht aufhören, SendTo und Drag & Drop für Skripte zu verwenden, also wird das mein Preis sein!
Squeezy
+1 auch von mir für source, das ist wirklich ein guter Punkt. @Adrian: Jetzt weißt du, warum SU dich das Kopfgeld nicht zu schnell vergeben ließ. IMHO Squeezys Antwort verdient das Kopfgeld, weil seine Antwort eleganter ist; Wenn du dich darüber schlecht fühlst, ;)kannst du meine Antwort immer noch akzeptieren (da sie auch dein Problem gelöst hat), aber ich würde auch nur mit Upvote zurechtkommen.
Mpy
4

Hier erfahren Sie, wie Sie ein Argument bashüber SendTo(oder per Drag & Drop) an eine Shell-Funktion übergeben . Als Beispiel habe ich das eingebaute verwendet echo. Legen Sie das Ziel für Ihren 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 angegebenen Befehlszeile a) , dh den vollständigen Dateinamen der Datei, für die die sendto-Aktion ausgeführt wurde. readhält das Fenster offen, damit Sie die Nachricht lesen können. (Ich habe dies mit Cygwin getestet bash, aber ich denke, Mingw bashsollte auch funktionieren.)

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 , sodass innerhalb des Skripts auf den Dateinamen verwiesen wird$1 .


Zu guter Letzt hier zwei Screenshots als Zusammenfassung:

Geben Sie hier die Bildbeschreibung ein


Geben Sie hier die Bildbeschreibung ein


a) Sie zitierten man bash:

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

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

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 gedruckt This is Baz. Die "Zeichenfolge" ist also alles zwischen den Apostrophen und Foo Bar Bazsind die Argumente.

mpy
quelle
1
Ahhh, das bedeutete das. Macht jetzt Sinn. Vielen Dank. Ich werde dir das Kopfgeld gewähren, sobald SO es mir erlaubt. (sagt, dass ich es in 11 Stunden aus irgendeinem Grund Achselzucken tun kann )
Adrian
0

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

Wenn das nicht funktioniert, können Sie auch versuchen, die .bat in .exe zu kompilieren.
Eine schnelle Google gefunden:

Batch-Compiler
Bat-To-Exe

harrymc
quelle
Ich weiß, dass ich einen Proxy Bat oder Exe verwenden kann. Ich würde gerne wissen, ob dies ohne einen solchen Proxy möglich ist.
Adrian
0

Probieren Sie diese aktualisierte Version der REG-Datei aus (Hinweis: Ich verwende 64-Bit-Windows 7; System32anstelle von SysWOW6432-Bit -Windows 7 , 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"="{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}"

Auf diese Weise können Ihre Shell-Skripte wie jede .bat-Datei auch als Administrator ausgeführt werden. Mit anderen Worten, es macht alle Shell-Skripte UAC-kompatibel, wenn Windows Vista und Windows 7 oder 8 verwendet werden.

kramlat
quelle