É possível usar um script de shell na pasta sendto?

7

Eu gostaria de usar um script de shell bash da pasta SendTo . Quando coloco um atalho em um lote ou exe na pasta SendTo , ele aparece no submenu de contexto Send To do shell, mas quando o atalho está apontando para um script de shell, ele não aparece.

O sistema operacional que estou testando é o Win7 Home Premium SP1. A extensão é .sh , que foi associada ao bash.exe do MinGW.

Meu script de shell tem uma extensão .sh e tentei desassociar a extensão .sh (acho que o MinGW a configurou inicialmente, mas isso não funcionou) usando este utilitário e tentou reassociá-lo ao bash usando:

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

em um shell cmd admin. Embora isso funcione em um prompt de comando e no shell do Explorer (com duplo clique), ele não será exibido no menu Send To e não aceitará um parâmetro arrastando um arquivo sobre o script diretamente.

Alguém sabe como eu faria isso?

    
por Adrian 18.06.2013 / 10:35

4 respostas

4

Isso ativará Drag & Largue a qualquer script. Você pode colocar um deles na pasta SendTo e usá-lo depois.

Exportação 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}"

A parte hexa é realmente "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*" , que é codificada na exportação.

Você provavelmente desejará remover o read após o teste, para poder escrever scripts que apenas executem uma tarefa sem deixar uma janela aberta. Se você precisar disso para scripts únicos, você sempre pode adicioná-lo ao final.

Use assoc .ext=ShellFile após a importação para vincular qualquer extensão de arquivo desejada com essa funcionalidade. O DropHandler neste exemplo funciona para o Windows XP e o Windows 7 (provavelmente outros também) e basicamente significa "executar o comando, com todos os nomes de arquivos ignorados como argumentos".

Use isso como um script ( echotest.ext ) para testar a funcionalidade básica:

echo $0 $*;
    
por 24.06.2013 / 20:46
4

Veja como passar um argumento para uma função bash shell via SendTo (ou por meio de arrastar e soltar). Como exemplo, usei o echo incorporado. Defina o destino do seu link na pasta SendTo da seguinte forma:

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

Aqui $0 significa o primeiro argumento após a linha de comando a) , ou seja, o nome completo do arquivo no qual a ação sendto foi executada. read mantém a janela aberta, para que você possa ler a mensagem. (Eu testei isso com bash do cygwin, mas acho que bash do mingw deveria funcionar também.)

No seu caso, o alvo deve ser

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

Agora seu script pode processar o nome do arquivo. Mas note que o nome do arquivo é passado para o script como o argumento primeiro , então dentro do script o nome do arquivo é referenciado como $1 .

Por último, mas não menos importante, há duas capturas de tela como resumo:

a) Você citou man bash :

-c string If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.

Para entender isso, use, por exemplo, a seguinte linha de segmentação:

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

Isso imprimirá This is Foo , enquanto

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

imprime This is Baz . Portanto, a "string" é tudo entre os apóstrofos e Foo Bar Baz são os argumentos.

    
por 24.06.2013 / 19:19
0

Se o Windows se recusar a vincular a um arquivo .sh, talvez você possa tentar usar um arquivo .bat que invoca o script .sh.

Se isso não funcionar, você também pode tentar compilar o .bat em .exe.
Um rápido google encontrado:

Compilador de lotes
Bat-To-Exe

    
por 24.06.2013 / 10:57
0

Tente esta versão atualizada do arquivo REG (observe que eu uso o Windows 7 de 64 bits; use System32 em vez de SysWOW64 se você tiver o Win7, Vista ou 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}"

Isso permitirá que seus scripts de shell também sejam executados como Administrador assim como qualquer arquivo .bat faz. Em outras palavras, isso torna todos os shell scripts compatíveis com o UAC ao usar o Windows Vista e Windows 7 ou 8.

    
por 02.09.2013 / 09:59