如何将所有.sh
文件关联到 Windows 10 周年更新中包含的新 BASH?
我已尝试.sh
使用默认系统提示关联文件,C:\Windows\System32\bash.exe
但它只是闪烁控制台窗口而没有任何结果。
答案1
也可以只使用批处理文件来完成:
@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%"
现在只需使用打开用...(记得检查总是使用此应用程序打开.sh 文件) 将 sh 文件与此批处理文件关联。
编辑:为 bash.exe包含--login
参数来设置所有适当的 Linux 特定环境变量(例如$PATH
)
答案2
问题是 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# 应用程序关联起来
虽然脏,但有用
答案3
等效的 Vbscript 方法(对于 PSSGCSim 的 C# 代码)将是:
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 文件,您需要修改脚本。
答案4
由于 Windows 10 仍然没有默认提供此功能(也没有拖放到 .sh),我决定创建一个只执行该操作的注册表项;
将.sh文件与bash.exe关联后,你将能够正确打开它;另外,你还可以将文件拖到.sh脚本中作为参数传递。
您可以在此处下载密钥:
http://www.mediafire.com/file/8lqd1v693uj1g6t/ShellBashScriptOpen_v7.rar
该键还启用了以提升模式运行脚本的选项(右键单击选项 - Windows 管理员和 Linux 超级用户),而额外的(可选)键启用右键单击 > 使用 nano 编辑
请记住,您必须将 bash.exe 设置为打开 .sh 文件的默认程序以应用这些更改(可执行路径为 C:/Windows/System32/bash.exe)
主注册表项执行以下脚本(作为注册表项,请记住 \" 变为 ",\$ 变为 $,\\ 变为 \ 并且 %% 变为 %):
#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; "
原始帖子:我可以使用 Windows 上的 Ubuntu 或 Windows Subsystem for Linux (WSL) 上的 Bash 将文件拖放到 .sh 脚本中吗?