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

8

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

O SO que estou testando é o Win7 Home Premium SP1. A extensão está .shassociada ao bash.exe do MinGW.

Meu script de shell tem uma .shextensão e tentei desassociá-la .sh(acho que o MinGW o configurou inicialmente, mas não funcionou) usando esse utilitário e tentei reassociá-lo ao bash usando:

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

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

Alguém sabe como eu faria isso?

Adrian
fonte
1
O Explorer executa o script do shell bash se você clicar duas vezes no atalho para o script do shell? O atalho é apenas para o script de shell ou para o bash parametrizado com o script de shell?
Werner Henze
qual é a extensão do arquivo do script? você estabeleceu uma associação de tipo de arquivo para esse tipo? o Windows não pode processar a linha de estrondo se estiver presente. qual bash para janelas você está usando?
18113 Frank Thomas Thomas
@FrankThomas: adicionamos as informações adicionais que você solicitou à pergunta.
Adrian
@WernerHenze: Uma tentativa de arrastar um arquivo sobre um link para o script faz com que um círculo vermelho com cruz apareça. Tentar colocá-lo diretamente sobre o script também não funciona (diz Move to *dir*), então estou pensando que não está recebendo parâmetros por algum motivo, mesmo que seja executado se você clicar duas vezes. Alguma idéia de por que isso seria assim?
Adrian
Não encontro a resposta para a segunda pergunta de Werner Henze, portanto, na mesma direção: você tentou usar c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.shcomo alvo do atalho SendTo?
mpy

Respostas:

4

Isso permitirá arrastar e soltar para qualquer script. Você pode colocar um deles na pasta SendTo e usá-lo posteriormente.

Exportação do 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 hexadecimal, na verdade, é a "C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"que é codificada na exportação.

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

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

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

echo $0 $*;
Squeezy
fonte
+1 por usar a sourceeliminação da chamada de outro shell e responder à minha pergunta secundária sobre arrastar e soltar. Infelizmente, essa não é a questão principal, então, infelizmente, você não receberá a recompensa. Mas obrigada. Eu tentei descobrir isso sem sucesso. (Y)
Adrian
Isso permitirá que você use shellscripts diretamente na pasta SendTo, em vez de criar um link para o bash.exe com o parâmetro do script. Na verdade, acredito que isso responde à sua pergunta, enquanto a resposta aceita fornece uma solução alternativa. Mas não vou discutir: P
Squeezy
Oh, bom saber. Obrigado. Hmmm, não tenho certeza a quem dar a recompensa para então. :(
Adrian
mpy, ele resolveu seu problema primeiro. Eu apenas resolvi isso, por curiosidade. Também não consigo parar de usar o SendTo e o Drag & Drop nos scripts desde então, então esse será meu prêmio!
Squeezy
+1 também para mim source, este é realmente um bom ponto. @Adrian: Agora você sabe, por que SU não deixou você premiar a recompensa muito rápido. A resposta do IMHO Squeezy merece a recompensa, porque sua resposta é mais elegante; se você se sentir mal com isso, ;)ainda poderá aceitar minha resposta (como também resolveu o seu problema), mas eu também ficaria bem apenas com o voto positivo.
mpy
4

Aqui está como passar um argumento para uma bashfunção shell via SendTo(ou via arrastar e soltar). Como exemplo, usei o builtin echo. Defina o destino para o seu link na SendTopasta da seguinte maneira:

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

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

No seu caso, o alvo deve ser

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

Agora seu script pode processar o nome do arquivo. Mas observe que o nome do arquivo é passado para o script como o primeiro argumento; portanto, dentro do script, o nome do arquivo é referido como$1 .


Por último, mas não menos importante, aqui estão duas capturas de tela como um resumo:

insira a descrição da imagem aqui


insira a descrição da imagem aqui


a) Você citou man bash:

-c stringSe a opção -c estiver presente, os comandos serão lidos da string. Se houver argumentos após a sequência, eles serão atribuídos aos parâmetros posicionais, começando com $ 0.

Para entender isso, use, por exemplo, a seguinte linha de destino:

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

Isso será impresso This is Foo, enquanto

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

irá imprimir This is Baz. Portanto, a "string" é tudo entre os apóstrofos e Foo Bar Bazsão os argumentos.

mpy
fonte
1
Ahhh, era isso que isso significava. Faz sentido agora. Obrigado. Vou te dar a recompensa assim que SO me deixar. (diz que eu posso fazê-lo em 11 horas, por algum motivo encolher de ombros )
Adrian
0

Se o Windows se recusar a vincular a um arquivo .sh, você pode tentar usar um arquivo .bat que invoque o script .sh.

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

Bat-To-Exe do compilador de lotes

harrymc
fonte
Eu sei que posso usar um proxy bat ou exe. Gostaria de saber se isso pode ser feito sem esse proxy.
Adrian
0

Experimente esta versão atualizada do arquivo REG (note que eu uso o Windows 7 de 64 bits; use em System32vez de SysWOW64se 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. Em outras palavras, ele torna todos os scripts de shell compatíveis com o UAC ao usar o Windows Vista e o Windows 7 ou 8.

kramlat
fonte