Пов’язати сценарії SH з Windows bash


6

Як я можу пов’язати всі .shфайли з новим BASH, включеним у оновлення Windows 10 Anniversary?

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


Можливо, програма запущена, і тоді вікно консолі зникає під час її запуску. Спробуйте запустити файли .sh з консолі.
Ініціалізатор

Відповіді:


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

Тепер просто використовуйте Open with ... (і не забудьте встановити прапорець Завжди використовувати цей додаток для відкриття .sh файлів ), щоб пов’язати sh-файли з цим пакетним файлом.

EDIT: включений --loginаргумент для bash.exe для встановлення всіх відповідних змінних оточуючих середовищ Linux (таких як $PATH)


3
+1, оскільки для рішення не потрібен компілятор або возитися з реєстром (безпосередньо), але використовуються добре відомі технології.
bracco23

Це не так, як запуск сценарію після запуску WSL, оскільки PATH не встановлений bashrc. Щоб отримати правильний PATH, змініть останній рядок на C:\Windows\System32\bash.exe -ic "/mnt/%drive%/%relpath%".
користувач2561747

Я думаю, вам все-таки потрібно буде використовувати реєстр, якщо ви хочете пропустити посібник Відкрити діалогове вікно.
користувач2561747

Щоб правильно встановити $ PATH (та інші змінні середовища WSL), вам потрібно використовувати bash.exe --login [script]замість просто `bash.exe [скрипт]". файл -> Властивості -> вкладка Загальні -> Тип файлу -> Змінити, потім натисніть кнопку Огляд і знайдіть .cmd Я відредагую відповідь, щоб включити це!
Leonel

При запуску цієї партії з 32-бітного додатку bash.exe не знайдено. Пояснення та вирішення
casper

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

Це чудово працює з MinGW (я особисто віддаю перевагу одному, що входить у комплект SmartGit):

ftype bashfile="C:\Program Files\SmartGit\git\bin\bash.exe" -c "'%1'"
assoc .sh=bashfile

-1

Оскільки Windows 10 досі не надав цю функцію (ні перетягування до .sh) за замовчуванням, я вирішив зробити ключ реєстру, який робить саме це;

Ви зможете правильно відкрити .sh файл після його прив’язки до bash.exe; крім того, ви можете перетягнути файли до скрипту .sh, щоб передати їх як параметри.

Ви можете завантажити ключ тут:

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

Ключ також дає можливість запускати скрипт у підвищеному режимі (опція правої кнопки миші - як адміністратор Windows, так і Linux суперпользователь), тоді як додатковий (необов'язковий) клавіша дозволяє правою кнопкою миші> редагувати з нано

Пам'ятайте, що ви повинні встановити 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 on Ubuntu в Windows або підсистеми Windows для Linux (WSL)?


1
Будь ласка, опублікуйте відповідь тут, а не лише посилання. (Я усвідомлюю, що посилання в цій відповіді вказує на інше питання щодо Супер Користувача - але відповідь є і відповіддю лише для посилання.)
Скотт

@Scott Я відредагував відповідь (використав відповідь на оригінальний пост із деякими змінами) і додав посилання на початкову публікацію внизу
Alex Sim

Це все-таки відповідь лише на посилання!
Скотт

@Scott Відредаговано після його резервного копіювання (його було видалено іншим модератором, разом із оригінальною відповіддю на повідомлення [що досі видалено]). Чи відповідь зараз нормальна чи мені все ж слід внести деякі зміни? А як же інша посада?
Алекс Сім

Будь ласка, не публікуйте однакову відповідь на кілька запитань. Якщо однакова інформація дійсно відповідає на обидва запитання, то одне питання (як правило, нове) має бути закрите як дублікат іншого. Ви можете вказати це, проголосувавши, щоб закрити його як дублікат або, якщо у вас недостатньо репутації для цього, підняти прапор, щоб вказати, що це дублікат. В іншому випадку підгадуйте свою відповідь на це питання і не просто вставляйте однакову відповідь у декілька місць.
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.