È possibile utilizzare uno script di shell nella cartella sendto?


8

Vorrei usare uno script di shell bash dalla SendTocartella. Quando inserisco un collegamento in un batch o exe nella SendTocartella, questo viene visualizzato nel Send Tosottomenu del contesto della shell , ma quando il collegamento punta a uno script della shell non lo fa.

Il sistema operativo su cui sto testando è Win7 Home Premium SP1. L'estensione è .shche è stata associata con bash.exe di MinGW.

Il mio script shell ha .shun'estensione e ho provato a dissociarlo .sh(penso che MinGW lo abbia impostato inizialmente, ma che non ha funzionato) usando questa utility e ho provato a riassociarlo per bash usando:

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

in una shell cmd admin. Sebbene funzioni al prompt dei comandi e alla shell di Explorer (tramite doppio clic), non verrà visualizzato nel Send Tomenu e non accetterà un parametro trascinando direttamente un file sopra lo script.

Qualcuno sa come lo farei?


1
Explorer esegue lo script della shell bash se si fa doppio clic sul collegamento allo script della shell? Il collegamento è solo per lo script della shell o per bash è parametrizzato con lo script della shell?
Werner Henze,

qual è l'estensione del file dello script? hai stabilito un'associazione di tipi di file per quel tipo? windows non può elaborare la linea di scoppio se è presente. quale bash-per-windows stai usando?
Frank Thomas,

@FrankThomas: ho aggiunto le informazioni aggiuntive che hai richiesto alla domanda.
Adrian,

@WernerHenze: un tentativo di trascinare un file su un collegamento allo script fa apparire un cerchio rosso con una croce. Anche il tentativo di inserirlo direttamente nello script non funziona (dice Move to *dir*), quindi sto pensando che non sta prendendo parametri per qualche motivo anche se viene eseguito se si fa doppio clic su. Qualche idea sul perché sarebbe così?
Adrian,

Non trovo la risposta alla seconda domanda di Werner Henze, quindi nella stessa direzione: hai provato a usare c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shcome obiettivo il collegamento SendTo?
mpy,

Risposte:


4

Ciò consentirà di trascinare e rilasciare su qualsiasi script. Puoi metterne uno nella cartella SendTo e usarlo in seguito.

Esportazione del 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 esadecimale in realtà è quella "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"che viene codificata nell'esportazione.

Probabilmente vorrai rimuovere il readtest dopo, quindi puoi scrivere script che eseguono semplicemente un'attività senza lasciare una finestra aperta. Se ne hai bisogno per i singoli script, puoi sempre aggiungerlo e aggiungerne la fine.

Utilizzare assoc .ext=ShellFiledopo l'importazione per collegare qualsiasi estensione di file desiderata con questa funzionalità. DropHandler in questo esempio funziona per Windows XP e Windows 7 (probabilmente anche altri) e sostanzialmente significa "esegui il comando, con tutti i nomi di file rilasciati come argomenti".

Usa questo come uno script ( echotest.ext) per testare le funzionalità di base:

echo $0 $*;

+1 per l'utilizzo sourcedell'eliminazione dell'invocazione di un'altra shell e la risposta alla mia domanda secondaria sul trascinamento della selezione. Sfortunatamente non è la domanda principale, quindi sfortunatamente non otterrai la taglia. Ma grazie. Ho provato a capirlo senza successo. (Y)
Adrian,

Ciò ti consentirà di utilizzare direttamente gli script di shell nella cartella SendTo, invece di creare un collegamento a bash.exe con il parametro dello script. In realtà credo che questo risponda alla tua domanda, mentre la risposta accettata fornisce una soluzione alternativa. Non litigherò però: P
Squeezy,

Oh, buono a sapersi. Grazie. Hmmm, non sono sicuro a chi dare la generosità allora. :(
Adrian,

mpy, ha risolto prima il tuo problema. L'ho appena risolto, per curiosità. Inoltre non posso smettere di usare SendTo e Drag & Drop negli script da allora, quindi questo sarà il mio premio!
Squeezy,

+1 anche da parte mia source, questo è davvero un buon punto. @Adrian: Ora sai, perché SU non ti ha lasciato premiare la taglia troppo in fretta. La risposta di IMHO Squeezy merita la grazia, perché la sua risposta è più elegante; se ti senti male per quello ;)puoi ancora accettare la mia risposta (dato che ha risolto anche il tuo problema), ma starei bene anche solo con il voto.
mpy,

4

Ecco come passare un argomento a una bashfunzione shell tramite SendTo(o tramite trascinamento della selezione). Come esempio ho usato il builtin echo. Impostare la destinazione per il collegamento nella SendTocartella come segue:

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

Qui $0sta per il primo argomento dopo la riga di comando a) , ovvero il nome file completo del file su cui è stata eseguita l'azione sendto. readmantiene aperta la finestra, in modo da poter leggere il messaggio. (L'ho provato con Cygwin bash, ma penso che anche i Mingw bashdovrebbero funzionare.)

Nel tuo caso, l'obiettivo dovrebbe essere

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

Ora il tuo script può elaborare il nome del file. Si noti, tuttavia, che il nome file viene passato allo script come primo argomento, quindi all'interno dello script viene indicato il nome file$1 .


Ultimo, ma non meno importante, ecco due schermate come riepilogo:

inserisci qui la descrizione dell'immagine


inserisci qui la descrizione dell'immagine


a) Hai citato man bash:

-c stringSe l'opzione -c è presente, i comandi vengono letti dalla stringa. Se ci sono argomenti dopo la stringa, vengono assegnati ai parametri posizionali, a partire da $ 0.

Per capirlo, usa ad esempio la seguente linea target:

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

Questo stamperà This is Foo, mentre

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

stamperà This is Baz. Quindi la "stringa" è tutto tra gli apostrofi e Foo Bar Bazsono gli argomenti.


1
Ahhh, questo è ciò che significava. Ha senso ora. Grazie. Ti ricompenserò non appena SO me lo permetterà. (dice che posso farlo in 11 ore per qualche motivo scrollando le spalle )
Adrian,

0

Se Windows rifiuta il collegamento a un file .sh, potresti provare a utilizzare un file .bat che richiama lo script .sh.

Se non funziona, puoi anche provare a compilare .bat in .exe.
Un rapido google trovato:

Compilatore batch
Bat-To-Exe


So che posso usare un proxy bat o exe. Vorrei sapere se può essere fatto senza tale proxy.
Adrian,

0

Prova questa versione aggiornata del file REG (nota che utilizzo Windows 7 a 64 bit; utilizzare System32invece di SysWOW64Win7, Vista o XP a 32 bit):

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

Ciò consentirà l'esecuzione degli script della shell anche come amministratore, esattamente come qualsiasi file .bat. In altre parole, rende tutti gli script di shell UAC compatibili quando si utilizza Windows Vista e Windows 7 o 8.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.