我想使用SendTo
文件夹中的 bash shell 脚本。当我将批处理或 exe 的快捷方式放入SendTo
文件夹中时,它会显示在 shellSend To
上下文子菜单中,但当快捷方式指向 shell 脚本时,它不会显示。
我测试的操作系统是 Win7 Home Premium SP1。扩展名是.sh
与 MinGW 的 bash.exe 关联的。
我的 shell 脚本有一个.sh
扩展,我尝试使用以下方法解除该.sh
扩展的关联(我认为 MinGW 最初设置了它,但没有用)此实用程序并尝试使用以下命令将其重新关联到 bash:
ftype ShellScript=c:\MinGW\msys\1.0\bin\bash.exe -c "'%1' %2"
assoc .sh=ShellScript
在管理员 cmd shell 中。虽然这可以在命令提示符和 Explorer shell 中工作(通过双击),但它不会显示在菜单中Send To
,也不会通过将文件直接拖到脚本顶部来接受参数。
有人知道我该怎么做吗?
答案1
这将启用拖放功能以拖放到任何脚本。您可以将其中一个脚本放在 SendTo 文件夹中,然后使用它。
注册表导出:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ShellFile]
[HKEY_CLASSES_ROOT\ShellFile\Shell]
[HKEY_CLASSES_ROOT\ShellFile\Shell\Open]
[HKEY_CLASSES_ROOT\ShellFile\Shell\Open\Command]
@=hex(2):43,00,3a,00,5c,00,70,00,61,00,74,00,68,00,5f,00,65,00,78,00,74,00,5c,\
00,62,00,61,00,73,00,68,00,2e,00,65,00,78,00,65,00,20,00,2d,00,63,00,20,00,\
22,00,73,00,6f,00,75,00,72,00,63,00,65,00,20,00,24,00,30,00,3b,00,72,00,65,\
00,61,00,64,00,22,00,20,00,25,00,31,00,20,00,25,00,2a,00,00,00
[HKEY_CLASSES_ROOT\ShellFile\ShellEx]
[HKEY_CLASSES_ROOT\ShellFile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"
十六进制部分实际上是"C:\cygwin\bin\bash.exe -c "source $0;read" %1 %*"
在导出时进行编码的。
您可能希望删除read
后续测试,这样您就可以编写只执行任务而不留下打开窗口的脚本。如果您需要单个脚本的此功能,您可以随时将其添加到脚本末尾。
导入后使用assoc .ext=ShellFile
此功能链接您想要的任何文件扩展名。本例中的 DropHandler 适用于 Windows XP 和 Windows 7(可能也适用于其他系统),其基本含义是“运行命令,将所有拖放的文件名作为参数”。
使用它作为脚本(echotest.ext
)来测试基本功能:
echo $0 $*;
答案2
以下是如何bash
通过SendTo
(或通过拖放)将参数传递给 shell 函数。作为示例,我使用了内置函数echo
。在文件夹中设置链接的目标SendTo
,如下所示:
C:\cygwin\bin\bash.exe -c "echo Argument: $0; read"
这里$0
代表第一个参数后给定的命令行a),即执行 sendto 操作的文件的完整文件名。read
保持窗口打开,以便您可以阅读消息。(我用 cygwin 测试了这一点bash
,但我认为 mingwbash
也应该可以工作。)
就你的情况而言,目标应该是
c:\MinGW\msys\1.0\bin\bash.exe -c "/path/to/your/script.sh $0; read"
现在你的脚本可以处理文件名了。但请注意,文件名作为第一的论点,所以在脚本中,文件名被引用为$1
。
最后,但并非最不重要的是,这里有两个屏幕截图作为总结:
a)您引用的是man bash
:
-c string
如果存在 -c 选项,则命令将从字符串中读取。如果字符串后面有参数,则它们将分配给位置参数,从 $0 开始。
为了理解这一点,请使用例如以下目标行:
C:\cygwin\bin\bash.exe -c "echo This is $0; read" Foo Bar Baz
这将打印This is Foo
,而
C:\cygwin\bin\bash.exe -c "echo This is $2; read" Foo Bar Baz
将打印This is Baz
。因此,“字符串”是撇号之间的所有内容,并且Foo Bar Baz
是参数。
答案3
如果 Windows 拒绝链接到 .sh 文件,您可以尝试使用调用 .sh 脚本的 .bat 文件。
如果这不起作用,您还可以尝试将 .bat 编译为 .exe。
快速谷歌搜索发现:
答案4
尝试这个更新版本的 REG 文件(注意,我使用的是 64 位 Windows 7;如果你使用的是 32 位 Win7、Vista 或 XP,请使用System32
代替):SysWOW64
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ShellFile]
@="Shell Script"
[HKEY_CLASSES_ROOT\ShellFile\DefaultIcon]
@="C:Windows\\SysWOW64\\imageres.dll,-68"
[HKEY_CLASSES_ROOT\ShellFile\shell]
[HKEY_CLASSES_ROOT\ShellFile\shell\edit]
[HKEY_CLASSES_ROOT\ShellFile\shell\edit\command]
@="C:\\Windows\\SysWOW64\\NOTEPAD.EXE %1"
[HKEY_CLASSES_ROOT\ShellFile\shell\open]
"EditFlags"=hex:00,00,00,00
[HKEY_CLASSES_ROOT\ShellFile\shell\open\command]
@="C:\\MinGW\\msys\\1.0\\bin\\bash.exe -c \"source $0;\" \"%1 %*\""
[HKEY_CLASSES_ROOT\ShellFile\shell\print]
[HKEY_CLASSES_ROOT\ShellFile\shell\print\command]
@="C:\\Windows\\SysWOW64\\NOTEPAD.EXE /p %1"
[HKEY_CLASSES_ROOT\ShellFile\shell\runas]
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\ShellFile\shell\runas\command]
@="C:\\MinGW\\msys\\1.0\\bin\\bash.exe -c \"source $0;\" \"%1 %*\""
[HKEY_CLASSES_ROOT\ShellFile\shell\runasuser]
@="@shell32.dll,-50944"
"Extended"=""
"SuppressionPolicyEx"="{F211AA05-D4DF-4370-A2A0-9F19C09756A7}"
[HKEY_CLASSES_ROOT\ShellFile\shell\runasuser\command]
"DelegatExecute"="{ea72d00e-4960-42fa-ba92-7792a7944c1d}"
[HKEY_CLASSES_ROOT\ShellFile\ShellEx]
[HKEY_CLASSES_ROOT\ShellFile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"
这将允许您的 shell 脚本像任何 .bat 文件一样以管理员身份运行。换句话说,它使所有 shell 脚本在使用 Windows Vista 和 Windows 7 或 8 时都兼容 UAC。