Posso arrastar e soltar arquivos em um script .sh usando o Bash no Ubuntu no Windows ou o Windows Subsystem for Linux (WSL)?

2

Eu quero passar vários arquivos como parâmetros de um script .sh no Windows 10, simplesmente arrastando-os sobre o arquivo de script; isso é possível?

    
por Alex Sim 02.11.2017 / 16:45

1 resposta

1

O Windows 10 (v1607 e anterior) ainda não fornece esse recurso por padrão.

Felizmente, você pode ativá-lo com uma chave de registro (fornecida abaixo)

A chave, claro, permite associar o script .sh ao bash.exe, assim também permite simplesmente clicar duas vezes no script

link (UPDATE: novas opções de ícones para o Ubuntu, OpenSUSE e instalação legada)

A chave também permite a opção de executar o script no modo usuário e elevado (o primeiro clicando duas vezes, o último é uma opção de clique direito), enquanto uma chave extra (opcional) permite clicar com o botão direito > editar com nano

Lembre-se que você primeiro tem que instalar Windows Subsystem for Linux e configurá-lo como programa padrão para abrir arquivos .sh (o caminho do programa é C: /Windows/System32/bash.exe)

A chave de registro principal executa o seguinte script

#This makes bash.exe silently execute the command below (whole code)
"%SYSTEMROOT%\System32\bash.exe" -c

#Gets all file paths without expansion/substitution
read -r -d '' path_param <<'EOF'
%*
EOF
read -r -d '' path_exec <<'EOF'
%L
EOF

#Parses all dragged files' paths from Windows paths to unix paths
path_param=$(echo $path_param | tr -d '"' | sed 's/[[:space:]]\([A-Z]:\)/\n/g' | sed 's/[A-Z]:/\/mnt\/\L&/g' | tr '\' '\/'\');
mapfile -t path_param <<< "$path_param";
path_param=("${path_param[@]//:}");

#Same, but with the .sh script path
path_exec=$(echo $path_exec | sed 's/[[:space:]]\([A-Z]:\)/\n/g' | sed 's/[A-Z]:/\/mnt\/\L&/g' | tr '\' '\/'\'); 
path_exec="${path_exec//:}";

#Sets working directory to the folder where the script is located
cd "${path_exec%\/*}";

#Executes script with or without parameters
if [[ ${path_param[@]} == "" ]];
    then "$path_exec";
    else "$path_exec" "${path_param[@]/#${path_exec%\/*}\/}";
fi;

#Leaves WSL console open after the .sh script finishes executing
cd ~; bash;
    
por 02.11.2017 / 16:45