É 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?


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 $*;

+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.


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.