5

Как я могу связать все .sh файлы с новым BASH, включенным в обновление Windows 10 Anniversary?

Я пытался связать файл .sh используя системное приглашение по умолчанию, с C:\Windows\System32\bash.exe но он просто мигает в окне консоли, но безрезультатно .

4 ответа4

4

Проблема в том, что BASH использует Unix-подобные пути, а Windows - пути DOS. Так что вам нужно перенаправить путь DOS к пути Unix.

Мое решение

Это больше похоже на взлом, чем реальное решение. ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК

Напишите крошечное консольное приложение C # для перенаправления путей

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;
}

И затем вы связываете .sh файлы с этим приложением C #

Грязный но работает

4

Это также возможно сделать с помощью командного файла:

@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%"

Теперь просто используйте Открыть с помощью ... (и не забудьте установить флажок Всегда использовать это приложение для открытия файлов .sh), чтобы связать sh-файлы с этим пакетным файлом.

РЕДАКТИРОВАТЬ: включен аргумент --login для bash.exe, чтобы установить все соответствующие переменные среды, специфичные для Linux (например, $PATH)

2

Эквивалентный метод Vbscript (для кода C # PSSGCSim) будет:

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

И файл ассоциации REG файл здесь:

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\""

Чтобы заставить это бежать.SH файлы из сети, вам нужно изменить скрипт.

-1

Поскольку Windows 10 по-прежнему не предоставляет эту функцию (и не выполняет перетаскивание в .sh) по умолчанию, я решил создать раздел реестра, который будет делать это;

Вы сможете правильно открыть файл .sh, связав его с bash.exe; Кроме того, вы можете перетащить файлы в сценарий .sh, чтобы передать их в качестве параметров.

Вы можете скачать ключ здесь:

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

Клавиша также позволяет запускать скрипт в режиме повышенных прав (опция правой кнопки мыши - как для администратора Windows, так и для суперпользователя Linux), а дополнительная (необязательная) клавиша позволяет щелкнуть правой кнопкой мыши> изменить с помощью nano.

Помните, что вы должны установить bash.exe в качестве программы по умолчанию, чтобы открывать файлы .sh для применения этих изменений (путь к исполняемому файлу C:/Windows/System32/bash.exe)

Основной раздел реестра выполняет следующий сценарий (будучи ключом reg, помните, что \ "становится", \ $ становится $, \\ становится \ и %% становится%):

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

ОРИГИНАЛЬНАЯ ПОЧТА: можно ли перетаскивать файлы в сценарий .sh с помощью Bash в Ubuntu в Windows или в подсистеме Windows для Linux (WSL)?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .