web-dev-qa-db-ja.com

Windows上のUbuntuまたはLinux用のWindowsサブシステム(WSL)でBashを使用してファイルを.shスクリプトにドラッグアンドドロップできますか?

複数のファイルをスクリプトファイル上にドラッグするだけで、Windows10の.shスクリプトのパラメーターとして渡したいのですが。これは可能ですか?

3
Alex Sim

Windows 10(v1607以降)は、デフォルトでこの機能を提供していません。

幸いなことに、レジストリキー(以下に提供)を使用して有効にすることができます

もちろん、このキーを使用すると、.shスクリプトをbash.exeに関連付けることができるため、スクリプトをダブルクリックするだけで済みます。

https://www.codeproject.com/Articles/1214365/Proper-Bash-scripting-on-Windows-Associate-SH-scri (更新: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;
2
Alex Sim