2014-01-30 2 views
3

Я использую VB Script для преобразования файлов ARF в формат MP4 и WMV. Сценарий использует API из Network Recording Player (который используется для просмотра и преобразования видеороликов Web-Ex, находящихся в формате ARF). Однако я испытываю очень странную ошибку. Преобразование WMV отлично работает на любом компьютере, в котором я его пытаюсь, но это не то же самое с MP4, который работает только на одной моей машине, но не на двух других, которые я пробовал.Ошибка конверсии в скрипте VB

Скрипт работает, преобразуя все файлы ARF, расположенные в определенной папке (в моем случае - папку «Webex» на диске C), как MP4, так и WMV, и сохраняет их в одной папке. Когда я открываю папку после запуска скрипта, я вижу определенные файлы, созданные во время преобразования, и после завершения остается только видео WMV. MP4 начинает конвертировать, а затем останавливается на определенных машинах. Вы можете увидеть созданный файл «videoname» -mp4.cfg, но затем он немедленно исчезнет.

Не знаю, в чем проблема, любая помощь будет оценена по достоинству.

Ниже мой scipt:

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

Вы удалили функцию «End If» в функции ** ListDir **? Похоже, вы пытаетесь объединить строки командных команд в одну команду Shell ... это не сработает. Просто используйте имена полного пути для exe и медиафайла. – PatricK

+0

Нет Я не удалял End Если в ListDir. Я подтвердил, что сценарий, запущенный на другом компьютере (который работает отлично), точно такой же, как и один запуск на моей машине. – user3254893

ответ

1

Я согласен с Nathan Rice, что это не проблема 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" 

Это позволит вам восстановить файлы журнала команд для каждого времени и найти ошибки, которые сообщили в командной строке.

Смежные вопросы