【问题标题】:Git hook pre-commit error: "command not found"Git钩子预提交错误:“找不到命令”
【发布时间】:2015-08-23 05:49:35
【问题描述】:

我有一个简单的 Git 钩子,可以调用其他一些 (VBScript) 脚本。当我从命令行调用它时,脚本运行正确。然而,当钩子被执行时,它给了我以下错误:

./RevisionDate.vbs: line 1: syntax error near unexpected token `('
./RevisionDate.vbs: line 1: `Set copyFSO = CreateObject ("Scripting.FileSystemObject")'
.git/hooks/pre-commit: line 8: Start-Sleep: command not found
test
./MovePDF.vbs: line 1: unexpected EOF while looking for matching `''
./MovePDF.vbs: line 6: syntax error: unexpected end of file

这是在钩子中调用的 VBScript。

Set copyFSO = CreateObject ("Scripting.FileSystemObject")
copyFSO.copyFile "C:\Users\Ian\Desktop\Test\*.pdf", "C:\Users\Ian\Desktop\Test2"
copyFSO.moveFile "C:\Users\Ian\Desktop\Test\*.pdf", "C:\Users\Ian\Desktop\Temp"

'------ Microsoft Excel -------

inputPrefix = cint(inputbox("Please enter two digit prefix for file you would like updated.", "File Update"))
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
sFolder = "C:\Users\Ian\Desktop\Test"
Set oFSO = CreateObject("Scripting.FileSystemObject")

For Each oFile In oFSO.GetFolder(sFolder).Files
    fileName = oFile
    Set objWorkbook = nothing
    Set objSelection = nothing
    Set objWorksheet = nothing

    If UCase(oFSO.GetExtensionName(oFile.Name)) = "XLSX" Then
        Prefix = left(oFile.Name, 2)
        filePrefix = cint(Prefix)
        Set objWorkbook = objExcel.Workbooks.Open(fileName)
        Set objSelection = objExcel.Selection
        Set objWorksheet = objWorkbook.Worksheets(1)
        objExcel.DisplayAlerts = False
        myYear = Year(Now())
        myMonth = Month(Now())
        myDay = Day(Now())
        myDate = myYear & "/" & myMonth & "/" & myDay
        myDateFile = myYear & "-" & myMonth & "-" & myDay

        If (filePrefix = inputPrefix) then
            objWorksheet.PageSetup.RightFooter = "Revision Date: " & myDate & " C"
            objWorkbook.Save
        End If

        fileName = Replace(oFile.Name, ".xlsx", "")
        saveAndCloseXlsx objWorkbook
    End if
Next

Function saveAndCloseXlsx(objWorkbook)
    objWorkbook.ExportAsFixedFormat xiTypePDF, "C:\Users\Ian\Desktop\Test\" & fileName
    objWorkbook.Close
end Function


'------ Microsoft Word -------

Set objWord = CreateObject("Word.Application")
objWord.Visible = False
sFolder = "C:\Users\Ian\Desktop\Test"
Set oFSO = CreateObject("Scripting.FileSystemObject")

For Each oFile In oFSO.GetFolder(sFolder).Files

    If UCase(oFSO.GetExtensionName(oFile.Name)) = "DOCX" Then
        fileName = oFile
        Set objDoc = objWord.Documents.Open(fileName)
        Set objSelection = objWord.Selection

        If objDoc.Bookmarks.Exists("RevisionDate") = True Then
            Set objRange = objDoc.Bookmarks("RevisionDate").Range
            myYear = Year(Now())
            myMonth = Month(Now())
            myDay = Day(Now())
            myDate = myYear & "/" & myMonth & "/" & myDay
            myDateFile = myYear & "-" & myMonth & "-" & myDay
            Prefix = left(oFile.Name, 2)
            filePrefix = cint(Prefix)

            If (inputPrefix = filePrefix) then
                objRange.text = "Revision Date: " & myDate & " C"
                objDoc.Bookmarks.Add "RevisionDate", objRange
            End If

            wdFormatPDF = 17
            SaveAndCloseDocx objDoc
        End If
    End if
Next

set oFSO = Nothing
objWord.Quit

Function SaveAndCloseDocx(objDoc)
    fileName = Replace(oFile.Name, ".docx", "")
    objDoc.SaveAs "C:\Users\Ian\Desktop\Test\" & fileName & ".pdf", wdFormatPDF
    objDoc.Close
End Function

最后是钩子本身:

#!/bin/sh
#
#
echo "Script Running"
cd 'C:\Users\Ian\desktop\QMS_Manual'
"./RevisionDate.vbs"
Start-Sleep -s 30
"./MovePDF.vbs"
cd 'C:\Users\Ian\desktop\Test2'
pdftk *.pdf cat output ECMWC.pdf
cd 'C:\Users\Ian\desktop\QMS_Manual'
DeleteAllButFinal.vbs

为什么会这样?我读过它可能与PATH 环境变量有关。

【问题讨论】:

  • @Kev 在 Powershell 方面:我以前有一个在 Powershell 中的包装脚本,但后来删除了它。谢谢你的收获。
  • 鉴于这是 BASH,您不需要转义所有这些反斜杠吗?
  • @whoisj 你的意思是把反斜杠改成普通的斜杠吗?
  • 您使用的是 msysgit 还是 Windows 版 Git?
  • @kev 我正在使用 github

标签: git github vbscript githooks


【解决方案1】:

您可能希望在调用 .vbs 脚本前加上:

cscript yourscript.vbs

您正在从 Git 挂钩运行 Bash/sh 脚本。

您的 Bash/sh 实现不知道如何处理 Start-Sleep,因为这是一个 PowerShell 命令。您需要找到一些等效的 Bash 或外壳到 PowerShell 来执行该语句。

然后该脚本尝试将RevisionDate.vbsMovePDF.vbs 的内容作为Bash/sh 语句执行,而不是启动通常在cmd.exe 命令shell 下关联的VBScript 解释器。因此,您需要告诉您的 shell 脚本如何执行此操作,即 cscript yourscript.vbs

路径:

还要注意这些路径。大多数 Windows Bash/sh shell 实现不知道C:\blah\blah 的含义(\ 用作转义字符)。相反,您需要使用 Unix 风格的路径。例如,

'C:\Users\Ian\desktop\Test2'

将转化为:

/c/Users/Ian/desktop/Test2

【讨论】:

  • 感谢您的建议,但没有解决或更改错误消息
  • 好吧,理论上我必须遍历整个 VBScript 并转换为 bash 才能运行?有什么办法可以正常运行VBScript?
  • @IanPennebaker 好的,打开一个 gitbash 控制台,然后输入 cscript,回车,然后告诉我你看到了什么。
  • Options: //B Batch mode: Suppresses script errors and prompts from displaying //D Enable Active Debugging //E:engine Use engine for executing script //H:CScript Changes the default script host to CScript.exe //H:WScript Changes the default script host to WScript.exe (default) //I Interactive mode (default, opposite of //B) //Job:xxxx Execute a WSF job //Logo Display logo (default) //Nologo Prevent logo display: No banner will be shown at execution time //S Save current command line options for this user
  • //T:nn Time out in seconds: Maximum time a script is permitted to run //X Execute script in debugger //U Use Unicode for redirected I/O from the console@Kev
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2013-12-15
  • 2019-07-12
  • 2015-01-13
  • 2018-05-21
  • 2021-07-10
相关资源
最近更新 更多