КопироватьФайл Vbscript

Мне нужно объединить любые файлы (2 ГБ), не читая их содержимое. Я пытался использовать метод CopyFile, но он не работает.

Мой код таков:

Public Function UnificarCRIs(ByVal path, ByVal FICRIEC, ByVal sessio, ByVal CIBAA)
Dim objFile, objCurrentFolder, filesys, origenFitxers
Dim FileName, WshShell

On error resume next

Set filesys = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objCurrentFolder = filesys.getFolder(path)
origenFitxers = " "

For Each objFile In objCurrentFolder.Files
    FileName = objFile
    If (right(FileName, 4) = ".cri") Then
        origenFitxers = FileName
        'Wscript.Echo FileName
        If filesys.FileExists(path & FICRIEC & sessio) Then
            'Wscript.Echo "If"
            Wscript.Echo path & FICRIEC & sessio & "+" & FileName
            filesys.CopyFile path & FICRIEC & sessio & "+" & FileName, path & FICRIEC & sessio 
             'WshShell.Run ("copy " & path & FICRIEC & sessio & "+" & FileName & " " & path & FICRIEC & sessio & "_tmp")
            'filesys.DeleteFile path & FICRIEC & sessio
            'filesys.MoveFile path & FICRIEC & sessio & "_tmp", path & FICRIEC & sessio
        Else
            Wscript.Echo "Else"
            WshShell.Run ("copy " & FileName & " " & path & FICRIEC & sessio)
            'filesys.CopyFile FileName,path & FICRIEC & sessio
        End If  
    End If 
Next

End Function

Есть ли способ объединить два файла с помощью Vbscript?

Спасибо


person user2069014    schedule 13.02.2013    source источник


Ответы (3)


Зависит от того, к каким COM-объектам у вас есть доступ и где выполняется код.

1) Если у вас есть доступ к Shell, то используйте команду копирования из приглашения DOS. В этом примере показано выполнение команды Dir, но это тот же метод.

Dim oShell    
Set oShell = WScript.CreateObject ("WScript.Shell")

' Note the True value means wait to complete...
' And the 0 value means do not display any window...

oShell.run "cmd /K CD C:\ & Dir", 0, True  

Set oShell = Nothing

И, возможно, также посмотрите здесь http://ss64.com/vb/shellexecute.html. Не знаю, поможет ли этот метод.

2) Если у вас нет оболочки, то, если вы можете создавать COM-объекты, создайте их с помощью C++, Delphi или VB6 и т. д. Затем используйте этот COM-объект для выполнения команды DOS для слияния.

3) В противном случае вам придется читать данные из файла. Если это текстовые файлы, то это легко, потому что для этого есть простые команды в файле Vbs. Если это двоичные данные, то требуется больше работы, чтобы получить двоичные данные и использовать функции стиля «LenB» и «AscB» для доступа к необработанным байтам Unicode. Но вы действительно не хотите этого делать. Любой сценарий обработки загрузки для ASP должен показать вам технику работы с необработанными байтами из строк.

person Community    schedule 13.02.2013
comment
Спасибо. Я мог бы запустить команду копирования с помощью метода Run, но теперь я не могу синхронизировать методы запуска в каждом цикле: - person user2069014; 14.02.2013
comment
Команда имеет параметры. Установите для параметра waitOnReturn значение TRUE, и он вернется только после того, как файл будет фактически объединен. ss64.com/vb/run.html - person ; 15.02.2013
comment
@bobshacks - пожалуйста, исправьте ошибки в операторе oShell.run (список параметров (), маркер комментария). - person Ekkehard.Horner; 15.02.2013
comment
@bobshacks - спасибо за улучшение кода (+1). Приношу свои извинения за назойливость, но только сейчас я вижу, что (n undefined) vbsTrue делает ваш фрагмент ловушкой — простое True было бы намного лучше. - person Ekkehard.Horner; 15.02.2013

Чтобы соединить два файла, «кто-то» должен прочитать (и записать) содержимое обоих файлов. Этот «кто-то» может быть copy [/B] f1 + f2 f3. Поэтому используйте свой цикл для создания правильных спецификаций файлов и WshShell.Run/.Exec подходящих команд.

person Ekkehard.Horner    schedule 13.02.2013
comment
Спасибо. Я мог бы запустить команду копирования с помощью метода Run, но теперь я не могу синхронизировать методы запуска в каждом цикле. - person user2069014; 14.02.2013

Вы можете комбинировать VBScript с командой Windows Copy для объединения файлов. Вы можете увидеть документ по добавлению двоичных файлов с помощью Копировать здесь https://support.microsoft.com/en-us/kb/71161

Вот пример техники:

JoinFiles "c:\test\", "c:\test\mergedfile.cri"

Function JoinFiles (inPath, outPath)
    Dim objShell, objFSO

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objShell = WScript.CreateObject("WScript.Shell")

    Dim strFilenames, objFile, intFilecount, intExitCode

    strFilenames = ""
    intFilecount = 0
    intExitCode = 0

    ' If the input folder exists, proceed to listing the files
    If objFSO.FolderExists (inPath) Then
        ' List the files in the folder and join the files which has cri extension
        For Each objFile In objFSO.GetFolder(inPath).Files
            If LCase (objFSO.GetExtensionName (objFile.Path)) = "cri" Then
                intFilecount = intFilecount+1
                strFilenames = strFilenames & """" & objFile.Path & """ + "
            End If
        Next

        ' If there're more than one file, proceed to join the file
        If (intFilecount > 1) Then
            ' join the files. Remove the last 3 characters from strFilenames (" + ").
            intExitCode = objShell.Run ("%COMSPEC% /C COPY /B " & Left (strFilenames, Len (strFilenames)-3) _
            & " """ & outPath & """ /Y", 0, True)
        Else
            ' Not enough file to join
        End If
    Else
        ' Can't find folder, exit.
    End If      
End Function
person Dat Nguyen    schedule 27.06.2016