如何在不使用命令行的情况下运行Perl脚本?

时间:2015-02-06 15:34:45

标签: excel perl user-interface excel-vba user-experience vba

我编写了一些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操作系统上更容易完成的任务。

2 个答案:

答案 0 :(得分:1)

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

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

然后您需要做的就是删除文件夹上的文件,它将在其上运行Perl脚本。

您可以在System Preferences-> Sharing中使用Samba与Windows用户共享该文件夹,以便他们从OS X的强大功能中受益。

答案 1 :(得分: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找到了一些东西。