是否可以在 sendto 文件夹中使用 shell 脚本?

是否可以在 sendto 文件夹中使用 shell 脚本?

我想使用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。
快速谷歌搜索发现:

批处理编译器
Bat-To-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。

相关内容