2015-12-26 1 views
0

J'ai récemment demandé de l'aide pour créer des sous-titres .srt. Here is the link. J'ai obtenu l'aide et tout fonctionne bien jusqu'à ce que le fichier vidéo dans le dossier ait des symboles Unicode dans son nom. Si c'est le cas, l'erreur VBScript apparaît. La question est de savoir comment faire fonctionner ce code correctement avec les symboles Unicode. Voici le code:Création de code de fichier batch avec VBScript pour travailler avec les symboles Unicode

@echo off&cls 

::The Path of your Videos files 

set "$VideoPath=C:\FolderwithVideos" 

::If you want your Code in this BAT remove the REMs Below : 

rem dir "%$VideoPath%" /O:S /b /-p /o:gn > "C:\result.txt" 
rem call replacer.bat result.txt ".mp4" "" 

setlocal enabledelayedexpansion 
set /a $Count=1 
set "$Timer=00:00:00" 


(for /f "delims=" %%a in (result.txt) do (
    call:getVideolength "%%a.mp4" 
    for /f "delims=" %%x in ('cscript //nologo getvideolength.vbs') do (
     call:SumTime !$Timer! %%x 
     for /f "delims=" %%y in ('cscript //nologo SumTime.vbs') do set "$NewTimer=%%y" 
     echo !$Count! 
     echo !$Timer!,000 --^> !$NewTimer!,000 
     echo %%a 
     Set $Timer=!$NewTimer! 
) 
    set /a $Count+=1 
    echo. 
))>Output.srt 

echo Done !!! 
type Output.srt 
pause 
exit/b 

:GetVideoLength 
(echo dim objShell 
echo dim objFolder 
echo dim objFolderItem 
echo set objShell = CreateObject("shell.application"^) 
echo set objFolder = objShell.NameSpace("%$videoPath%"^) 
echo set objFolderItem = objFolder.ParseName(%1^) 
echo dim objInfo 
echo objInfo = objFolder.GetDetailsOf(objFolderItem, 27^) 
echo wscript.echo objinfo)>GetVideoLength.vbs 
exit/b 


:SumTime 
echo wscript.echo FormatDateTime(CDate("%1"^) + CDate("%2"^),3^) >SumTime.vbs 
exit/b 
+0

Quelle est la capture en utilisant le fichier batch ici? pourquoi n'utilisez-vous pas seulement vbscript, y a-t-il une raison à cela? –

+0

Non, pas de raison du tout. Je pensais que ce serait plus facile, parce que cela m'est le plus familier. Personnellement, je ne code pas du tout, j'ai juste quelques connaissances de surface. S'il y a un autre moyen d'atteindre mon objectif, je vous serais reconnaissant si vous aidiez. – user5715027

Répondre

3

Après avoir examiné la question précédente, je fusionné tout le code et la logique dans un fichier unicode VBScript sûr.

Option Explicit 

Const adUnsignedBigInt = 21 
Const adVarWChar = 202 
Const adVarChar = 200 

Dim VideoDir 
    VideoDir = "C:\FolderwithVideos" 
    'or from a script argument when called like : cscript script.vbs "C:\FolderwithVideos" 
    'VideoDir = WScript.Arguments(0) 

Const adSaveCreateOverWrite = 2 
Const adCRLF = -1 
Const adWriteLine = 1 

Dim ShellApp 
Set ShellApp = CreateObject("Shell.Application") 

Dim Fso 
Set Fso = CreateObject("Scripting.Filesystemobject") 

Dim VideoExts 
Set VideoExts = CreateObject("scripting.dictionary") 
    VideoExts.CompareMode = vbTextCompare 
    VideoExts.Add "mp4", Null 
    'add more extensions if you need 
    'VideoExts.Add "srt", Null 
    'VideoExts.Add "mkv", Null 

Dim SrtStream 
Set SrtStream = CreateObject("Adodb.Stream") 
    SrtStream.Charset = "utf-8" 
    SrtStream.Open 

Dim Folder, IFolderItem, VideoCount, OldDuration, NewDuration, FileExtension, SrtPath, RsSorted 
Set RsSorted = CreateObject("Adodb.Recordset") 
    RsSorted.Fields.Append "Name", adVarWChar, 255 
    RsSorted.Fields.Append "Size", adUnsignedBigInt 
    RsSorted.Fields.Append "Duration", adVarChar, 8 
    RsSorted.Open 

NewDuration = TimeSerial(0,0,0) 
Set Folder = ShellApp.NameSpace(VideoDir) 
For Each IFolderItem In Folder.Items 
    FileExtension = Fso.GetExtensionName(IFolderItem.Name) 
    If VideoExts.Exists(FileExtension) Then 
     RsSorted.AddNew Array("Name", "Size", "Duration"), Array(IFolderItem.Name, IFolderItem.Size, Folder.GetDetailsOf(IFolderItem, 27)) 
    End If 
Next 
    RsSorted.UpdateBatch 
    RsSorted.Sort = "Size, Name" 
If Not RsSorted.BOF Then RsSorted.MoveFirst 
While Not RsSorted.EOF And Not RsSorted.BOF 
    FileExtension = Fso.GetExtensionName(RsSorted("Name").Value) 
    VideoCount = VideoCount + 1 
    OldDuration = NewDuration 
    NewDuration = OldDuration + CDate(RsSorted("Duration").Value) 
    SrtStream.WriteText VideoCount, adWriteLine 
    SrtStream.WriteText OldDuration & ",001 --> " & NewDuration & ",000", adWriteLine  
    SrtStream.WriteText Left(RsSorted("Name").Value, Len(RsSorted("Name").Value) - (Len(FileExtension) + 1)), adWriteLine 
    SrtStream.WriteText "", adWriteLine 
    RsSorted.MoveNext 
Wend 

SrtPath = Fso.BuildPath(VideoDir, "Output.srt") 
SrtStream.SaveToFile SrtPath, adSaveCreateOverWrite 
SrtStream.Close 

WScript.Echo "Done!" 
WScript.Echo SrtPath 
+0

Tout est génial, mais pourriez-vous faire en sorte que les fichiers vidéo dans le dossier soient triés par taille, et seulement après que ce script s'exécute? A part ça, tout fonctionne bien! – user5715027

+0

Si vous saviez comment vous m'avez aidé! Une si belle communauté ici! Merci beaucoup! – user5715027

+0

@ user5715027 ce n'est pas comme ça que ça fonctionne. acceptez ceci comme réponse parce que c'est la réponse. puis posez une nouvelle question avec le nouveau numéro. –