如何创建可拖放的Strawberry Perl程序?

13

我有一个使用Strawberry Perl编写的程序,它接受一个单一文件作为命令行参数。 我该如何设置程序,使得我可以将所需的文件拖放到Strawberry Perl程序(或其包装程序)上,并使用该文件名作为参数运行该程序?


我认为这更多取决于你的操作系统而不是编程语言。你使用的是哪个操作系统和版本? - Jack M.
2
@Jack M. -- Strawberry Perl是Windows的新官方Perl。因此,我假定任何知道答案的人都会隐含操作系统来回答我的问题。 - skiphoppy
3
为了更清晰明确:Strawberry Perl是一个为Windows开发的Perl语言版本,带有一个捆绑的gcc编译器并得到社区支持。虽然它不是“官方perl”(对于Perl来说这个概念无关紧要),但在过去几年中已经变得非常流行。http://strawberryperl.com/ - xdg
3个回答

21

在Windows下(已测试XP),您可以创建一个.cmd文件,并简单地使用参数%1运行Perl程序,以像在命令行中执行一样传递文件名。

perl c:\test.pl %1

那么您可以简单地将文件拖放到 .cmd 文件上以执行。


你还可以将此文件放入“发送到”文件夹中,然后在 shell 中右键单击 -> 发送到。 - Robert P
Frakkle,你真厉害!后续问题:如何使控制台窗口在显示其输出后不立即关闭? :) - skiphoppy
罗伯特,谢谢;我有一个同事想要以那种方式使其工作。 - skiphoppy
回答我的后续问题:暂停。 - skiphoppy
@skiphoppy - 在你运行的命令结尾添加 "&& pause"。例如,我在我的桌面上创建了一个RCS checkout命令(co.exe)的包装器(这是包装器很好用的一个案例!)。包装器的内容只需简单地写上 "co.exe -l %1 && pause",它将在检出文件后暂停! - jimtut
显示剩余2条评论

19

哎呀!当你不需要时,请不要创建一个包装脚本或命令。

进入Windows的注册表或文件类型对话框,并重新定义Perl的默认操作,例如:

"C:\path-to-perl-folders\perl.exe" "%1" %*

这将导致双击.PL文件启动perl.exe并使用双击的文件名(%1)打开。处理%*(将任何文件名参数传递给Perl脚本)比较棘手。

再次进入注册表(实际上它并不像人们想象的那么可怕),为Perl类找到/创建一个"shellex"键,然后创建一个名为"DropHandler"的子键,其默认字符串值为"{86C86720-42A0-1069-A2E8-08002B30309D}"(至少在Windows XP的美国版本中是我的DropHandler)。

这允许.PL文件(实际上是与Perl类相关联的任何文件)具有拖放处理程序,告诉资源管理器在您将文件拖到.PL脚本上时要执行什么操作。在这种情况下,它只意味着"使用拖放的文件作为参数运行Perl脚本"。

嗯,我觉得我没有很好地解释清楚,但这就是我为一个大型工程组织设置Perl(从网络驱动器运行)的方式。在Google中搜索Perl和DropHandler,您应该能够获取.reg注册表脚本来为您完成此操作。


1
好的,很棒!我之前不知道这个方法。当然,使用包装脚本的优点是非常容易部署到其他机器上。我想两种方法都有利弊吧,但这是一个很酷的解决方案。 - Frakkle

1
以下是与“包装器”相关的另一种选择,但需要对perl脚本进行轻微修改:
1. 将您的script.pl脚本重命名为script.cmd。 2. 在文件顶部添加以下内容:
@SETLOCAL ENABLEEXTENSIONS @c:\path\to\perl.exe -x "%~f0" %* @exit /b %ERRORLEVEL% #!perl #line 6 #...perl script continues here...
该脚本像任何其他批处理文件一样运行。前三行基本上在CMD文件本身上调用Perl(%~f0,仅在CMD扩展被打开时才起作用)。perl.exe的-x paremeter告诉Perl跳过直到#!perl行的所有内容。“#line 6”只是有助于调试。
当我不太了解目标系统(可能无法编辑注册表)时,这是我首选的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接