可以在sendto文件夹中使用Shell脚本吗?


9

我想使用SendTo文件夹中的bash shell脚本。当我将批处理或exe快捷方式放到SendTo文件夹中时,它会显示在shell Send 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

在admin cmd shell中。尽管这可以在命令提示符和Explorer外壳上运行(通过双击),但它不会显示在Send To菜单中,并且不能通过直接在脚本顶部拖动文件来接受参数。

有人知道我会怎么做吗?


1
如果双击shell脚本的快捷方式,Explorer是否会运行bash shell脚本?是仅使用Shell脚本为Shell脚本或bash设置了快捷方式吗?
Werner Henze 2013年

脚本的文件扩展名是什么?您是否为该类型建立了文件类型关联?Windows无法处理爆炸线(如果存在)。您正在使用哪种bash for Windows?
Frank Thomas

@FrankThomas:我已将您要求的其他信息添加到问题中。
阿德里安

@WernerHenze:尝试将文件拖到脚本的链接上会导致出现带有叉的红色圆圈。尝试将其直接放置在脚本上也不起作用(例如Move to *dir*),因此我认为即使由于双击而执行,由于某种原因它也没有采用参数。知道为什么会这样吗?
阿德里安

我找不到Werner Henze的第二个问题的答案,所以在类似的方向上:您是否尝试将c:\MinGW\msys\1.0\bin\bash.exe -c C:\Path\To\Your\Script.sh用作快捷方式的目标SendTo
mpy

Answers:


4

这将允许拖放到任何脚本。您可以将其中之一放置在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 $*;

+1用于source消除对另一个shell的调用并回答有关拖放的问题。不幸的是,这不是主要问题,因此不幸的是您不会获得赏金。但是,谢谢。我试图解决这个问题,但没有成功。(Y)
Adrian

这将使您可以直接在SendTo文件夹中使用shellscript,而不必使用脚本的参数创建指向bash.exe的链接。实际上,我相信这可以回答您的问题,而可接受的答案可以解决。虽然不会争论:P
Squeezy

哦,很高兴知道。谢谢。嗯,不确定谁给赏金。:(
阿德里安

先生,他首先解决了您的问题。我只是出于好奇而解决了这个问题。从那时起,我就再也不能停止使用SendTo和拖放到脚本了,所以这将是我的荣幸!
Squeezy 2013年

我也source为此+1 ,这确实是一个好点。@Adrian:现在您知道,为什么SU不让您太快地授予赏金。IMHO Squeezy的答案值得悬赏,因为他的答案更优雅;如果您对此感到不满意,;)您仍然可以接受我的回答(因为它也解决了您的问题),但是仅支持upvote也可以。
mpy

4

这是bash通过SendTo(或通过拖放)将参数传递给Shell函数的方法。作为示例,我使用了内置的echoSendTo如下所示在文件夹中设置链接目标:

C:\cygwin\bin\bash.exe -c "echo Argument: $0; read"

这里$0代表给定命令行a)之后的第一个参数,即执行sendto操作的文件的完整文件名。使窗口保持打开状态,以便您可以阅读消息。(我用cygwin的进行了测试,但我认为mingw的也可以。)readbashbash

在您的情况下,目标应该是

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也是参数。


1
啊,那是什么意思。现在有意义。谢谢。我会尽快授予您赏金。(说我能做到在11小时内由于某种原因,耸肩
阿德里安

0

如果Windows拒绝链接到.sh文件,则可以尝试使用调用.sh脚本的.bat文件。

如果这不起作用,您也可以尝试将.bat编译为.exe。
快速谷歌发现:

批处理编译器
Bat-To-Exe


我知道我可以使用代理bat或exe。我想知道如果没有这种代理就可以做到。
阿德里安

0

尝试使用此更新版本的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文件一样以管理员身份运行。换句话说,使用Windows Vista和Windows 7或8时,它使所有外壳脚本UAC兼容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.