2015-02-06 97 views
1

我写了几个Perl脚本,可以让我更快地完成工作。每个脚本的运行,像这样的命令:如何在不使用命令行的情况下运行Perl脚本?

perl PerlScript.pl InFile > OutFile 

两个INFILE和OutFile将一般制表符分隔的文件,我的工作场所的其余部分只看到为Excel文件。我的同事可以从使用这些脚本中受益,但是他们被从命令行运行程序的想法吓倒了。 有没有一些方法可以从GUI等更友好的用户界面运行Perl脚本?我的理想解决方案是让他们将一个Excel文件拖入一个文件夹,然后用鼠标点击一个按钮,这会产生一个新的Excel文件,并将其拖回到他们需要的地方。

我对Visual Basic一无所知,除了它存在,但我有一个暗示它可能对这个问题有用。是否可以在Visual Basic脚本中运行Perl脚本?认为一般害怕命令行和计算机科学的人能够舒适地运行Visual Basic脚本是否合理?

注意:我使用Mac OS和大多数同事一样。 Windows特定的解决方案会很好,因为我们有几台Windows计算机专用于任务,无论出于何种原因,它们都可以在Windows操作系统上轻松完成。

+1

如果你设置了Perl作为一个文件关联,那么你可以双击脚本运行它。尽管你需要以不同的方式处理命令行参数。 – Sobrique 2015-02-06 15:37:20

+2

你在使用什么操作系统? – 2015-02-06 15:38:06

+2

鉴于对Excel和VB的参考,我将假定Windows ...... – Sobrique 2015-02-06 15:38:50

回答

0

您可以使用Shell命令在VBA中执行此操作。这是Windows环境中的一个例子。我不确定这些命令在OSX环境中的工作情况。

感谢Onorio Catenacci直接窃取了一些代码。

Public Const CmdPath = "C:\Windows\system32\cmd.exe" 
Public Const PerlExecPath = "C:\path\to\perl\bin\perl.exe" 
Public Const ScriptPath = "C:\Temp\script.pl" 
Public Const OutputDir = "C:\Temp" 

Function FileExists(ByVal FileToTest As String) As Boolean 
    FileExists = (Dir(FileToTest) <> "") 
End Function 

Function GetWorkbookIfLoaded(ByVal FileName As String) As Workbook 
    Dim lWbName As String 
    lWbName = Dir(FileName) 
    If lWbName = "" Then 
     lWbName = FileName 
    End If 
    On Error Resume Next 
    Set GetWorkbookIfLoaded = Workbooks(lWbName) 
    On Error GoTo 0 
End Function 

Function DeleteFile(ByVal FileToDelete As String) 
    Dim lUserOK As Boolean 
    Dim lReturn As Boolean 
    Dim lWbName As String 
    Dim oBk As Workbook 

    lUserOK = True 
    lWbName = Dir(FileToDelete) 

    lReturn = (lWbName = "") 

    If Not lReturn Then 
     Set oBk = GetWorkbookIfLoaded(lWbName) 

     If Not oBk Is Nothing Then 
     oBk.Close 
     Set oBk = GetWorkbookIfLoaded(lWbName) 
     lUserOK = (oBk Is Nothing) 
     End If 

     If lUserOK Then 
      SetAttr FileToDelete, vbNormal 
      Kill FileToDelete 
      lReturn = True 
     End If 

    End If 
    DeleteFile = lReturn 

End Function 

Sub CreateNewExcel() 
    Dim lProceed As Boolean 
    Dim lRetVal  As Double 
    Dim lMsgResult As VbMsgBoxResult 
    Dim lOutputPath As String 
    Dim lCommand As String 

    lOutputPath = OutputDir & "\output.tab" 
    lCommand _ 
     = CmdPath & " /C " & PerlExecPath & " -e " _ 
     & Chr(34) & "print qq[${\(scalar localtime)}\t1\t2\t3\t4\n]" _ 
     & Chr$(34) & " > " & lOutputPath 

    lProceed = DeleteFile(lOutputPath) 
    If Not lProceed Then Exit Sub 

    DoEvents 

    lRetVal = Shell(lCommand, vbHide) 
    Application.Wait (Now + TimeValue("0:00:01")) 

    If lRetVal = 0 Or Not FileExists(lOutputPath) Then 
     MsgBox ("Failed to run script") 
    Else 
     Workbooks.Open (lOutputPath) 
    End If 

End Sub 

我不得不在Application.Wait调用抛出,因为测试的文件存在,有时会赶上尚未删除的文件,或者没有赶上未完全创建的文件。

我在StackOverflow的其他地方找到了一些executing stuff in an Apple environment的东西。

1

这听起来像是OSX Folder Action的完美应用程序。基本上,你开始Automator,并告诉它你想创建一个Folder Action,它给你一个分屏,你可以做的事情在左边,你开发你的脚本在右边。

将动作Run shell script从左侧拖动到右侧,并选择将其应用于顶部的文件夹。然后将其从运行bash更改为使用/usr/bin/perl中的Perl解释器并粘贴脚本。

然后,您只需将文件放在文件夹上,然后运行Perl脚本就可以了。

你可以在System Preferences-> Sharing使用Samba您的Windows用户共享该文件夹,使他们受益于OS X.的功率

+0

Automator的+1。出于某种原因,我总是忘记这个工具,但它确实为非终端用户提供了一个很好的选择。 – jimtut 2015-02-07 05:43:46