我有一个Strawberry Perl程序,它接受单个文件作为命令行参数。如何设置,以便我可以将所需的文件拖放到Strawberry Perl程序(或它周围的包装器)上,程序以该文件的名称作为参数运行?
答案 0 :(得分:20)
在Windows下(使用XP测试),您可以创建一个.cmd文件,只需让它运行Perl程序,参数为%1即可传递文件名,就好像命令行执行一样。
perl c:\test.pl %1
然后您只需将文件拖放到.cmd文件即可执行。
答案 1 :(得分:18)
Eeek!如果不需要,请不要创建包装器脚本/ cmd。
进入您的注册表或Windows中的“文件类型”对话框,并重新定义Perl默认操作,说:
"C:\path-to-perl-folders\perl.exe" "%1" %*
这将导致双击.PL以使用双击文件(%1)的名称启动perl.exe。 %* stuff(将任何文件名参数传递给Perl脚本)比较棘手。
再次进入注册表(实际上,它并不像人们想象的那么可怕)并在Perl类下找到/创建一个“shellex”键,然后创建一个名为“DropHandler”的子键,其默认字符串值为“{86C86720-42A0-1069-A2E8-08002B30309D}”(至少,这是我在美国版Windows XP中的DropHandler)。
这允许.pl文件(实际上,与Perl类相关联的任何内容)具有一个drop处理程序,告诉Explorer在.pl脚本上删除文件时要执行的操作。在这种情况下,它只是意味着“以删除的文件作为参数运行Perl脚本”。
嗯,我不认为我解释得那么好,但这就是我为大型工程组织设置Perl(运行网络驱动器)的方式。 Google for Perl和DropHandler,您应该能够获得.reg注册表脚本来为您执行此操作。答案 2 :(得分:1)
这是“包装器”的另一种替代方法,但它需要对perl脚本稍作修改:
@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
”只是帮助调试。
当我对目标系统了解不多(并且可能无法编辑注册表)时,这是我首选的解决方案。