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


2

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



@Ramhoundこのリンクの質問superuser.com/questions/1260528/…は重複と見なされる可能性がありますが、この1つ(ドラッグアンドドロップ)が重複していることに同意しません。解決策は同じかもしれませんが、問題は解決しようとしている検索ユーザーは異なっており、この具体的な質問せずにそれを見つけることができませんでした
アレックスシム

モデレーターが説明したように、既存の質問への回答が別の質問に回答する場合、その質問は別の質問の複製と見なすことができます。モデレーターができないことをやっているだけです。なぜなら、もし彼らがこの質問を閉じることに投票したなら、それは拘束力があるからです。 コミュニティを配置したジレンマは、重複した回答が複数の質問に提出されるべきではない理由です。
ラムハウンド

回答:


1

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;

このキーは、WSLの古いバージョンと新しいバージョンの両方で機能するはずです(実行可能パスがまだC:/Windows/System32/bash.exeである場合、確認できますか?まだ更新1709を受け取っていません)
Alex Sim

ところで@Ramhound、私はいくつかのグーグル検索を行って、このMSページmsdn.microsoft.com/en-us/commandline/wsl/faqを見つけました。ここで、ファイルがまだSystem32にありますが、キーはおそらくWSLでも機能します。繰り返しますが、私はちょうど私が私がメディア作成ツール経由でアップデートをインストールし、それを試してみますね、ここで想定しています
アレックスシム

@Ramhound申し訳ありませんが、それは不適切な単語の選択でした。私が意図したのは、Bash / WSLがこの機能をまだ提供していない(または提供したことがない)ということです。どのキーがないことは黙ってそれに対応するLinuxのパスに、Windowsのファイルパスを解析し、スクリプトのパラメータとして渡すためにbashスクリプトを実行している
アレックスシム

@Ramhoundこのmedium.com/@finnzeit/…を見つけました。明らかに(私の理解では)まだbash.exe実行可能ファイルがありますが、デフォルトのシェルを自動的に実行するwsl.exe実行可能ファイルもあります。この場合、私のレジストリキーは引き続き機能しますが、新しいwsl.exeファイルで動作するように改善することができます
Alex Sim

1
複数の質問に同じ回答を投稿しないでください。同じ情報が実際に両方の質問に答える場合、1つの質問(通常は新しい質問)をもう1つの質問の複製として閉じる必要があります。重複として閉じるように投票することでこれを示すことができます。または、そのための十分な評判がない場合は、重複であることを示すフラグ立てます。それ以外の場合は、この質問に対する回答を調整し、同じ回答を複数の場所に貼り付けないでください。
DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.