将 SH 脚本关联到 Windows bash

PSS*_*Sim 9 bash windows-10 windows-subsystem-for-linux windows-10-v1607

如何将所有.sh文件关联到 Windows 10 周年更新中包含的新 BASH?

我曾尝试.sh使用默认系统提示关联文件,C:\Windows\System32\bash.exe但它只是闪烁控制台窗口而没有结果。

小智 5

也可以只使用批处理文件:

@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%"
Run Code Online (Sandbox Code Playgroud)

现在只需使用Open with...(并记得选中Always use this app to open .sh files)将 sh 文件与此批处理文件相关联。

编辑:包含--loginbash.exe 的参数以设置所有适当的 linux 特定环境变量(例如$PATH

  • +1 因为该解决方案不需要编译器或(直接)弄乱寄存器,而是使用众所周知的技术。 (3认同)

PSS*_*Sim 4

问题是 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;
}
Run Code Online (Sandbox Code Playgroud)

然后将.sh文件与此 C# 应用程序关联

肮脏但有效


归档时间:

查看次数:

4628 次

最近记录:

6 年 前