2

Я хочу передать несколько файлов в качестве параметров сценария .sh в Windows 10, просто перетащив их поверх файла сценария; Это возможно?

1 ответ1

1

Windows 10 (v1607 и более поздние версии) по-прежнему не предоставляет эту функцию по умолчанию.

К счастью, вы можете включить его с помощью ключа реестра (см. Ниже)

Ключ, конечно же, позволяет связать скрипт .sh с bash.exe, что также позволяет просто дважды щелкнуть скрипт

https://www.codeproject.com/Articles/1214365/Proper-Bash-scripting-on-Windows-Associate-SH-scri (UPDATE: добавлены новые опции значков для Ubuntu, OpenSUSE и устаревшей установки)

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

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

Основной ключ реестра выполняет следующий скрипт

#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\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 $path_exec | sed 's/[[:space:]]\([A-Z]:\)/\n\1/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;

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