将 SH 脚本与 Windows bash 关联

将 SH 脚本与 Windows bash 关联

如何将所有.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 脚本中吗?

相关内容