2014-01-30 74 views
3

我正在使用VB腳本將ARF文件轉換爲MP4和WMV格式。該腳本使用Network Recording Player中的API(用於查看和轉換ARF格式的Web-Ex視頻)。但是,我遇到了一個非常奇怪的錯誤。 WMV轉換在我嘗試使用的任何機器上都能正常工作,但這與MP4只能在我的一臺機器上運行,而不是在另外兩臺機器上運行。VB腳本轉換錯誤

該腳本通過將位於特定文件夾中的所有ARF文件(在我的情況下,C盤中名爲「Webex」的文件夾)轉換爲MP4和WMV並將它們保存在同一文件夾中。 當我在運行腳本之後打開文件夾時,可以看到在轉換過程中創建的某些文件,一旦完成,只剩下WMV視頻。 MP4開始轉換,然後在某些機器上停止。您可以看到正在創建的「videoname」-mp4.cfg文件,但它會立即消失。

不真的知道問題是什麼,任何幫助將不勝感激。

下面是我素文字:

Option Explicit 

'Main 

Sub Main 
    Dim Path 
    Dim a: a = ListDir("C:\Webex\*.arf") 
    Dim FileName 
    Dim FileName1 
    Dim FileName2 
    Dim mp4 
    Dim wmv 
    Dim objFSO 
    Dim objFile 
    Dim objTextFile 
    Dim WSHShell 
    Dim StrCMDLine 
    Dim d: d = ListDir("C:\Webex\*.cfg") 
    Set WSHShell = CreateObject("WScript.Shell") 
    For Each FileName In d 
     Set objFSO = CreateObject("Scripting.FileSystemObject") 
     objFSO.DeleteFile(Filename) 
    Next 
    For Each FileName In a 
     mp4 = 0 
     wmv = 0 
     'WScript.Echo FileName 
     'WScript.Echo Left(Filename,(Len(Filename)-4)) 
     Dim b: b = ListDir(Left(Filename,(Len(Filename)-4))+".mp4") 
     For Each FileName1 In b 
      'WScript.Echo FileName1 
      mp4 = 1 
     Next 
     Dim c: c = ListDir(Left(Filename,(Len(Filename)-4))+".wmv") 
     For Each FileName2 In c 
      'WScript.Echo FileName2 
      wmv = 1 
     Next 
     If mp4 = 0 Then 
      Set objFSO = CreateObject("Scripting.FileSystemObject") 
      Set objTextFile = objFSO.CreateTextFile(Left(Filename,(Len(Filename)-4))+"-mp4.cfg") 
      objTextFile.WriteLine("") 
      objTextFile.WriteLine("[Console]") 
      objTextFile.WriteLine("inputfile="+Filename) 
      objTextFile.WriteLine("media=MP4") 
      objTextFile.WriteLine("showui=0") 
      objTextFile.WriteLine("[UI]") 
      objTextFile.WriteLine("chat=0") 
      objTextFile.WriteLine("qa=0") 
      objTextFile.WriteLine("largeroutline=1") 
      objTextFile.WriteLine("[MP4]") 
      objTextFile.WriteLine("outputfile="+Left(Filename,(Len(Filename)-4))+".mp4") 
      objTextFile.WriteLine("width=1024") 
      objTextFile.WriteLine("height=768") 
      objTextFile.WriteLine("framerate=8") 
      objTextFile.Close 
     End If 
     If wmv = 0 Then 
      Set objFSO = CreateObject("Scripting.FileSystemObject") 
      Set objTextFile = objFSO.CreateTextFile(Left(Filename,(Len(Filename)-4))+"-wmv.cfg") 
      objTextFile.WriteLine("[Console]") 
      objTextFile.WriteLine("inputfile="+Filename) 
      objTextFile.WriteLine("media=WMV") 
      objTextFile.WriteLine("showui=0") 
      objTextFile.WriteLine("PCAudio=0") 
      objTextFile.WriteLine("[UI]") 
      objTextFile.WriteLine("largeroutline=0") 
      objTextFile.WriteLine("[WMV]") 
      objTextFile.WriteLine("outputfile="+Left(Filename,(Len(Filename)-4))+".wmv") 
      objTextFile.WriteLine("width=1024") 
      objTextFile.WriteLine("height=768") 
      objTextFile.WriteLine("videocodec=Windows Media Video 9") 
      objTextFile.WriteLine("audiocodec=Windows Media Audio 9.2 Lossless") 
      objTextFile.WriteLine("videoformat=default") 
      objTextFile.WriteLine("audioformat=default") 
      objTextFile.WriteLine("videokeyframes=4") 
      objTextFile.WriteLine("maxstream=1000") 
      objTextFile.Close 
     End If 
    Next 
    Dim e: e = ListDir("c:\Webex\*.cfg") 
    For Each FileName In e 
     Set objFSO = CreateObject("Scripting.FileSystemObject") 
     StrCMDLine = "cmd /c C: & CD %windir% & C:\ProgramData\WebEx\WebEx\500\nbrplay.exe -Convert " + """" + FileName + """" + " & exit" 
     'WScript.Echo StrCMDLine 
     wshShell.run StrCMDLine ,0,True 
     objFSO.DeleteFile(Filename) 
    Next 

End Sub 

Public Function ListDir (ByVal Path) 
    Dim fso: Set fso = CreateObject("Scripting.FileSystemObject") 
    If Path = "" Then Path = "*.*" 
    Dim Parent, Filter 
    If fso.FolderExists(Path) Then ' Path is a directory 
     Parent = Path 
     Filter = "*" 
    Else 
     Parent = fso.GetParentFolderName(Path) 
     If Parent = "" Then If Right(Path,1) = ":" Then Parent = Path: Else Parent = "." 
     Filter = fso.GetFileName(Path) 
     If Filter = "" Then Filter = "*" 
    End If 
    ReDim a(10) 
    Dim n: n = 0 
    Dim Folder: Set Folder = fso.GetFolder(Parent) 
    Dim Files: Set Files = Folder.Files 
    Dim File 
    For Each File In Files 
     If CompareFileName(File.Name,Filter) Then 
      If n > UBound(a) Then ReDim Preserve a(n*2) 
      a(n) = File.Path 
      n = n + 1 
     End If 
    Next 
    ReDim Preserve a(n-1) 
    ListDir = a 
End Function 

Private Function CompareFileName (ByVal Name, ByVal Filter) ' (recursive) 
    CompareFileName = False 
    Dim np, fp: np = 1: fp = 1 
    Do 
     If fp > Len(Filter) Then CompareFileName = np > Len(name): Exit Function 
     If Mid(Filter,fp) = ".*" Then ' special case: ".*" at end of filter 
      If np > Len(Name) Then CompareFileName = True: Exit Function 
     End If 
     If Mid(Filter,fp) = "." Then ' special case: "." at end of filter 
      CompareFileName = np > Len(Name): Exit Function 
     End If 
     Dim fc: fc = Mid(Filter,fp,1): fp = fp + 1 
     Select Case fc 
      Case "*" 
      CompareFileName = CompareFileName2(name,np,Filter,fp) 
      Exit Function 
      Case "?" 
      If np <= Len(Name) And Mid(Name,np,1) <> "." Then np = np + 1 
      Case Else 
      If np > Len(Name) Then Exit Function 
      Dim nc: nc = Mid(Name,np,1): np = np + 1 
      If StrComp(fc,nc,vbTextCompare)<>0 Then Exit Function 
     End Select 
    Loop 
End Function 

Private Function CompareFileName2 (ByVal Name, ByVal np0, ByVal Filter, ByVal fp0) 
    Dim fp: fp = fp0 
    Dim fc2 
    Do ' skip over "*" and "?" characters in filter 
     If fp > Len(Filter) Then CompareFileName2 = True: Exit Function 
     fc2 = Mid(Filter,fp,1): fp = fp + 1 
     If fc2 <> "*" And fc2 <> "?" Then Exit Do 
    Loop 
    If fc2 = "." Then 
     If Mid(Filter,fp) = "*" Then ' special case: ".*" at end of filter 
      CompareFileName2 = True: Exit Function 
     End If 
     If fp > Len(Filter) Then ' special case: "." at end of filter 
      CompareFileName2 = InStr(np0,Name,".") = 0: Exit Function 
     End If 
    End If 
    Dim np 
    For np = np0 To Len(Name) 
     Dim nc: nc = Mid(Name,np,1) 
     If StrComp(fc2,nc,vbTextCompare)=0 Then 
      If CompareFileName(Mid(Name,np+1),Mid(Filter,fp)) Then 
       CompareFileName2 = True: Exit Function 
      End If 
     End If 
    Next 
    CompareFileName2 = False 
End Function 
+0

從命令提示符手動運行此行,看看會發生什麼。這不是VBScript問題。 StrCMDLine =「cmd/c C:&CD%windir%&C:\ ProgramData \ WebEx \ WebEx \ 500 \ nbrplay.exe -Convert」+「」「」+ FileName +「」「」+「&exit」 –

+0

您是否在函數** ListDir **中刪除了「End If」?看起來你正在嘗試將批處理命令行組合成單個Shell命令......它不起作用。只需使用完整路徑名稱爲exe和媒體文件。 – PatricK

+0

不,我沒有刪除一個End如果在ListDir中。我已經確認腳本運行在另一臺機器上(工作正常)和我的機器上運行的腳本完全一樣 – user3254893

回答

1

我彌敦道賴斯同意,這是不是一個VBScript問題。您需要檢索命令行在執行cmd時轉儲的錯誤。

因此,嘗試重寫此:

StrCMDLine = "cmd /c C: & CD %windir% & C:\ProgramData\WebEx\WebEx\500\nbrplay.exe -Convert " + """" + FileName + """" + " & exit" 

這樣:

dim timelog : timelog = replace(replace(formatdatetime(Now, 3), ":", "-"), " ", "-") 
StrCMDLine = "cmd /c C: & CD %windir% & C:\ProgramData\WebEx\WebEx\500\nbrplay.exe -Convert " + """" + FileName + """" + " > C:\dumplog-" + timelog + ".txt & exit" 

這將讓你找回你的命令日誌文件,每次和查找命令提示符報告的錯誤。