Question Associer des scripts SH à Windows bash


Comment puis-je associer tout .sh fichiers à la nouvelle BASH inclus dans la mise à jour Windows 10 Anniversary?

J'ai essayé d'associer .sh fichier en utilisant l'invite du système par défaut pour C:\Windows\System32\bash.exe mais il clignote simplement la fenêtre de la console sans résultat.


4
2017-08-07 12:41


origine


Il se peut que le programme soit en cours d'exécution et que la fenêtre de la console disparaisse lors de son exécution. Essayez d'exécuter les fichiers .sh à partir de la console. - TheInitializer


Réponses:


Le problème est que BASH utilise des chemins de type Unix et Windows des chemins DOS. Vous devez donc rediriger le chemin DOS vers le chemin Unix.

Ma solution

C'est plus un hack qu'une vraie solution. À UTILISER À VOS RISQUES ET PÉRILS

Ecrire une petite application de la console C # pour rediriger les chemins

string[] splt = args[0].Split(':');
string exe = Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\bash.exe";
string arguments = "/mnt/" + splt[0].ToLower() + splt[1].Replace('\\', '/');

using (Process process = new Process())
{
    process.StartInfo.FileName = exe;
    process.StartInfo.Arguments = arguments;

    process.Start();
    process.WaitForExit();

    return process.ExitCode;
}

Et puis vous associez .sh fichiers avec cette application C #

Sale mais fonctionne


4
2017-08-07 15:25





Il est également possible de faire avec un simple fichier batch:

@echo off

REM Get the full qualified path for the first argument
SET fullpath=%~f1

REM Get the drive letter and convert it to lowercase
SET drive=%fullpath:~0,1%
FOR %%i IN ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z") DO CALL SET drive=%%drive:%%~i%%

REM Replace \ with /
SET relpath=%fullpath:~3%
SET relpath=%relpath:\=/%

C:\Windows\System32\bash.exe --login "/mnt/%drive%/%relpath%"

Maintenant, utilisez simplement Ouvrir avec... (et rappelez-vous de vérifier Toujours utiliser cette application pour ouvrir les fichiers .sh) associer les fichiers sh à ce fichier batch.

MODIFIER: inclus --login l'argument de bash.exe pour définir toutes les variables d'environnement spécifiques Linux spécifiques (telles que $PATH)


4
2017-11-08 14:51



+1 car la solution n'a pas besoin d'un compilateur ou de jouer avec le registre (directement), mais utilise des technologies bien connues. - bracco23
Cela ne se comporte pas exactement comme si vous exécutiez le script après le lancement de WSL, car PATH n'était pas défini par bashrc. Pour obtenir le bon PATH, changez la dernière ligne en C:\Windows\System32\bash.exe -ic "/mnt/%drive%/%relpath%". - user2561747
Je pense que vous auriez encore besoin d'utiliser le registre si vous vouliez sauter le manuel Ouvrir avec dialogue. - user2561747
Pour définir correctement la variable $ PATH (et les autres variables d'environnement WSL), il vous suffit d'utiliser bash.exe --login [script]au lieu de simplement `bash.exe [script]". Et le fichier .cmd peut être assigné comme programme par défaut si vous cliquez avec le bouton droit sur un fichier .sh -> Propriétés -> onglet Général -> Type de fichier -> Modifier, puis cliquez sur Parcourir et trouver le .cmd je vais éditer la réponse pour inclure cela! - Leonel
Lorsque vous démarrez ce lot depuis une application 32 bits, bash.exe est introuvable. Explication et solution: github.com/Microsoft/BashOnWindows/issues/... - casper


La méthode Vbscript équivalente (pour le code C # de PSSGCSim) serait:

If WScript.arguments.count <> 0 And LCase(Right(WScript.Arguments(0), 3)) = ".sh" Then
    Dim WshShell: Set WshShell = WScript.CreateObject("Wscript.Shell")
    strSHfile = WScript.Arguments(0)
    MyArr = Split(strSHfile, ":")
    strSHfile = "/mnt/" & LCase(MyArr(0)) & MyArr(1)
    strSHfile = Replace(strSHfile,"\","/")
    WshShell.Run "%systemroot%\system32\bash.exe " & """" & sSHfile  & """",,True
    Set WshShell = Nothing
End If

Et le fichier REG association de fichiers est ici:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.sh]
@="shfile"

[HKEY_CLASSES_ROOT\shfile]
@="SH Script File"

[HKEY_CLASSES_ROOT\shfile\shell\open\command]
@="wscript.exe \"D:\\Scripts\\bash.vbs\" \"%1\""

Pour le faire exécuter des fichiers .SH à partir du réseau, vous devez modifier le script.


2
2017-08-07 16:49





Étant donné que Windows 10 ne fournissait toujours pas cette fonctionnalité (ni glisser-déplacer vers .sh) par défaut, j'ai décidé de créer une clé de registre qui ne fait que cela;

Vous pourrez ouvrir un fichier .sh correctement après l'avoir associé à bash.exe; De plus, vous pouvez faire glisser des fichiers vers le script .sh pour les transmettre en tant que paramètres.

Vous pouvez télécharger la clé ici:

http://www.mediafire.com/file/8lqd1v693uj1g6t/ShellBashScriptOpen_v7.rar

La clé permet également d’exécuter le script en mode élevé (option de clic droit - à la fois sur Windows admin et le superutilisateur Linux), tandis qu’une touche supplémentaire (facultative) permet de cliquer avec le bouton droit de la souris> modifier avec nano

Rappelez-vous que vous devez avoir défini bash.exe comme programme par défaut pour ouvrir les fichiers .sh afin d'appliquer ces modifications (le chemin de l'exécutable est C: /Windows/System32/bash.exe)

La clé de registre principale exécute le script suivant (étant une clé de registre, rappelez-vous que \ "devient", \ $ devient $, \\ devient \ et %% devient%):

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

#Parses the dragged file paths from Windows paths to unix paths
path_param=\$(echo \"%*\" | sed 's/[[:space:]]\\([A-Z]:\\)/\\n\\1/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 \"%l\" | sed 's/[[:space:]]\\([A-Z]:\\)/\\n\\1/g' | sed 's/[A-Z]:/\\/mnt\\/\\L&/g' | tr '\\\\' '\\/'\');
path_exec=\"\${path_exec//:}\";

#Removes the wole path (leaving only the file name) if the parameters are in the same directory of the script
if [[ \"\${path_param%%\\/*}\" -ef \"\${path_exec%%\\/*}\" ]];
    then path_param=(\"\${path_param[@]/#\${path_param%%\\/*}\\/}\");
fi;

#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; "

POSTE ORIGINAL: Puis-je faire glisser et déposer des fichiers sur un script .sh en utilisant Bash sur Ubuntu sous Windows ou Windows Subsystem for Linux (WSL)?


-1
2017-11-04 15:01



S'il vous plaît poster le répondre ici, pas seulement un lien. (Je me rends compte que le lien dans cette réponse pointe vers un autre Super utilisateur question - mais la réponse est également une réponse par lien uniquement.) - Scott
@Scott J'ai édité la réponse (utilisé la réponse de la publication originale avec quelques modifications) et ajouté un lien vers la publication originale dans le bas - Alex Sim
Ceci est toujours une réponse de lien seulement! - Scott
@Scott Edited après l'avoir récupéré (il a été supprimé par un autre modérateur, avec la réponse à la publication d'origine [qui est toujours supprimée]). La réponse est-elle correcte maintenant ou devrais-je encore apporter des modifications? Aussi, qu'en est-il de l'autre poste? - Alex Sim
S'il vous plaît ne pas poster la même réponse à plusieurs questions. Si les mêmes informations répondent réellement aux deux questions, alors une question (généralement la plus récente) doit être fermée en double. Vous pouvez l'indiquer par voter pour le fermer en double ou, si vous n'avez pas assez de réputation pour cela, lever un drapeau pour indiquer qu'il s'agit d'un doublon. Sinon, adaptez votre réponse à cette question et ne vous contentez pas de coller la même réponse à plusieurs endroits. - DavidPostill♦