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