Копирование файлов с сохранением структуры папок vbs
Can anyone please tell me how to copy a file from one folder to another using vbscripting I had tried this below one from the information provide in the internet.
When I execute this one, I get that the permission is denied.
I get some output into one folder,i just need to copy that output from that folder to another folder where this output would begiven as input to another executable.
Are you running this as a .VBS script file, in IE, etc.? Can you do the same copy in a batch file run as the same user?
I am trying to determine if the script has the right to write to c:\destfolder\. Do you get the same error if you replace the last line with a shell call Set objShell = CreateObject("Wscript.Shell") objShell.Run "copy c:\sourcefolder\anyfile.txt c:\destfolder\"?
5 Answers 5
Try this. It will check to see if the file already exists in the destination folder, and if it does will check if the file is read-only. If the file is read-only it will change it to read-write, replace the file, and make it read-only again.
Can we copy the files to Unix system with the above code? And if a username/password is required while copying, where should we pass that. thanks.
For copying the single file, here is the code:
Here's an answer, based on (and I think an improvement on) Tester101's answer, expressed as a subroutine, with the CopyFile line once instead of three times, and prepared to handle changing the file name as the copy is made (no hard-coded destination directory). I also found I had to delete the target file before copying to get this to work, but that might be a Windows 7 thing. The WScript.Echo statements are because I didn't have a debugger and can of course be removed if desired.
Just posted my finished code for a similar project. It copies files of certain extensions in my code its pdf tif and tiff you can change them to whatever you want copied or delete the if statements if you only need 1 or 2 types. When a file is created or modified it gets the archive attribute this code also looks for that attribute and only copies it if it exists and then removes it after its copied so you dont copy unneeded files. It also has a log setup in it so that you will see a log of what time and day evetrything was transfered from the last time you ran the script. Hope it helps! the link is Error: Object Required; 'objDIR' Code: 800A01A8
Ну как-то вот так наверное :
XCopy on VBScript
name = "SRC"
helpstring = "Source directory (/S also possible)"
type = "string"
required = "true"
/>
name = "DST"
helpstring = "Destination directory (/D also possible)"
type = "string"
required = "true"
/>
name = "Good"
helpstring = "file for cood copied files (/G)(default - strout)"
type = "string"
required = "false"
/>
name = "Bad"
helpstring = "file for BAD copied files (/B) (default - strerr)"
type = "string"
required = "false"
/>
Example: vxcopy.wsf /S:"c:\debug" /D:"c:\release"
On Error Resume Next
Const ForReading = 1, ForWriting = 2
Set oFso = CreateObject("Scripting.FileSystemObject")
if WScript.Arguments.Named.Item("SRC") <> "" then
SDir = WScript.Arguments.Named.Item("SRC")
Elseif WScript.Arguments.Named.Item("S") <> "" then
SDir = WScript.Arguments.Named.Item("S")
Else
Wscript.Echo "Source directory must be set."
Wscript.Echo "----------------------------"
WScript.Arguments.ShowUsage
WScript.Quit (1)
end if
if WScript.Arguments.Named.Item("DST") <> "" then
DDir = WScript.Arguments.Named.Item("DST")
Elseif WScript.Arguments.Named.Item("D") <> "" then
DDir = WScript.Arguments.Named.Item("D")
Else
Wscript.Echo "Destination directory must be set."
Wscript.Echo "----------------------------"
WScript.Arguments.ShowUsage
WScript.Quit (2)
end if
if WScript.Arguments.Named.Item("Good") <> "" then
FileName = WScript.Arguments.Named.Item("Good")
elseif WScript.Arguments.Named.Item("G") <> "" then
FileName = WScript.Arguments.Named.Item("G")
Else
FileName = ""
end if
if FileName <> "" Then
Set GoodFile = oFso.OpenTextFile(FileName, ForWriting, True)
if Err Then
Wscript.Echo "Error open Good file = " & FileName
Wscript.Echo "----------------------------"
WScript.Quit (3)
end if
Else
Set GoodFile = Wscript.StdOut
end if
if WScript.Arguments.Named.Item("Bad") <> "" then
FileName = WScript.Arguments.Named.Item("Bad")
elseif WScript.Arguments.Named.Item("B") <> "" then
FileName = WScript.Arguments.Named.Item("B")
Else
FileName = ""
end if
if FileName <> "" Then
Set BadFile = oFso.OpenTextFile(FileName, ForWriting, True)
if Err Then
Wscript.Echo "Error open Badfile = " & FileName
Wscript.Echo "----------------------------"
WScript.Quit (3)
end if
Else
Set BadFile = Wscript.StdErr
end if
if NOT oFso.FolderExists(SDir) Then
Wscript.Echo "Error open source directory" & sDir
Wscript.Echo "----------------------------"
WScript.Quit (3)
Else
CopyDir SDir, DDir
end if
Sub CopyDir ( ByVal Src, ByVal Dst )
If NOT oFSO.FolderExists(Dst) Then
Set Folder = oFSO.CreateFolder(Dst)
if Err Then
Err.Clear
BadFile.Write "Create Folder - " & Dst & vbcrlf
'. Hmmmm Need write other files to Bad log?
Exit Sub
Else
GoodFile.Write "Create folder - " & Dst & vbcrlf
end if
end if
for each Folder in oFSO.GetFolder(Src).Subfolders
CopyDir Src & "\" & Folder.Name , Dst & "\" & Folder.Name
next
for each File in oFSO.GetFolder(Src).Files
oFSO.CopyFile File, Dst & "\" & File.Name
if Err Then
Err.Clear
BadFile.Write "File - " & File.Path & "\" & File.Name & vbcrlf
Else
GoodFile.Write File.Path & "\" & File.Name & vbcrlf
end if
next
Там в одном месте в подпрограмме стоит выход, если создание каталога неудачно. Соответственно всё что глубже этого каталога в логи не пойдет. Если её убрать, то в логах будут ошибки от создания поддеревьев.
Доброго времени суток! Фабула задачи такова :
естьtempout.txt файл с перечнем имен файлов без расширений, в виде 020_1290 ;
StartFolder = D:\ - откуда копируем;
EndFolder = D:\PL\ - куда копируем.
Нужно скопировать заданные в списке файлы (с любым расширением). Начал делать дошел до разбора строк и "споткнулся" на сравнивании переменных, строк из масива с именами файлов. Не хватает опыта и знаний.
И еще вопрос как в папке рассортировать содержимое по подпапкам имена которых это первые 3 символа имён файлов, т.е. 19zap.txt и archiv.avi из папки D:\svalka\ переместятся 19zap.txt в D:\svalka\19z\ , а archiv.avi в D:\svalka\arc\. За ранее благодарен.
4 Ответ от Flasher 2015-09-11 17:48:03 (изменено: Flasher, 2015-09-11 19:50:53)
- Flasher
- Заблокирован
- Неактивен
на тотале я знаю, как сделать, но этот способ не подходит для общей автоматизации выполняемых задач.
3 Ответ от dmitriypopov86 2015-09-11 13:38:04 (изменено: dmitriypopov86, 2015-09-11 13:42:24)
dmitriypopov86
Касаемо первый задачи:
Спасибо за отклик! Да задача одноразовая , один раз прочитали список и копировали необходимые файлы, на букву диска можно не смотреть - это необязательный параметр, очень принципиально что б скрипт был на vbs, на тотале я знаю, как сделать, но этот способ не подходит для общей автоматизации выполняемых задач. Хм. я что то не так наверное делаю, подставляю параметры и скрипт все время ругается что должно быть 3 параметра. Подскажите путь к списку должен быть такого вида : List = "D:\PL\tempout.txt" или List = fso.GetFile("D:\PL\tempout.txt") ?
Как скопировать папку вручную
Прежде всего, вам нужно открыть директорию или диск, в котором находится пака, которую надо скопировать. Нажимаем правой кнопкой мыши по папке, в появившемся контекстном меню выбираем пункт "Копировать", нажимаем мышкой по данному пункту. Теперь нам надо открыть тот каталог или диск, в который надо скопировать структуру папок или просто папку. Щелкаем правой кнопкой мыши по пустой области и в появившемся меню выбираем пункт "Вставить", нажимаем по данному пункту и всё, выбранная папка скопирована. Однако, можно скопировать таким же методом и несколько папок, просто выделяем нужные директории и по одному из них выбираем пункт "Копировать", а уже далее, как и в примере выше, вставляем выбранные документы в нужное место.
Стоит обратить внимание, что скопировать структуру папок проще всего через менеджер файлов, например, Total Commander, он хорош тем, что весь процесс копирования папок позволяет держать под контролем, и вы всегда сможете проверить, все ли данные скопированы. В случае с примером выше, вы можете просто использовать комбинации клавиш "Ctrl + C" и "Ctrl + V", чтобы скопировать одну или несколько папок в нужное место. Также обратите внимание, что если вы скопируете папки в одно и то же место, то Windows автоматически добавит к их именам префикс , так как папок с одинаковыми именами в одном месте быть не может.
Хорошо, теперь наступило время заняться программированием и описанием методов объекта FileSystemObject:
BuildPath (path, name) – Метод позволяет добавить к заданному пути path новое имя name. Как это работает, мы рассмотрим ниже.
CopyFolder (source, destination [,overwrite]) – Собственно, то, что нам и надо, метод показывает как скопировать папку на диск или в другую директорию.
- source – Путь к папке, которую нужно скопировать, можно использовать подстановочные знаки "?" – любой один символ или "*" – любое количество символов. В случае использования подстановочных знаков, мы можем, как копировать папку в одном экземпляре, так и сразу несколько, это позволит не использовать в программном коде циклы.
- destination – Путь к директории, в которую нужно скопировать папку.
- overwrite – Если параметр установлен в логическое значение true – будет происходить замена, false – не производить замены (по умолчанию).
И так, с теорией разобрались, теперь настало время приступить к программированию. Давайте сделаем так, я сначала приведу программный код на языке VBScript, дам пояснения к программному коду, и мы продолжим двигаться дальше.
'********************************************** ' Объект FileSystemObject методы CopyFolder и BuildPath ' Как скопировать папку на диск ' CopyFolder.vbs '********************************************** Option Explicit dim fso, new_folder, new_sub_folder, i dim WshShell, cur_dir ' формируем ссылку на объект set WshShell = CreateObject("WScript.Shell") ' текущий каталог cur_dir = WshShell.CurrentDirectory ' создаем ссылку на объект FileSystemObject set fso=CreateObject ("Scripting.FileSystemObject") ' создаем в текущей папке новый каталог set new_folder=fso.CreateFolder("Новый каталог_vbs") ' циклично сздаем 9 папок for i=1 to 9 set new_sub_folder=fso.CreateFolder(i &"_папка") ' как копировать в папку next WScript.Echo "Проверьте содержимое текущего каталога" WScript.Echo "Сейчас произойдет копирование 9 папок в каталог " & new_folder ' копируем 9 папок в другой каталог 'fso.CopyFolder cur_dir & "\?_папка", cur_dir & "\Новый каталог_vbs", true ' альтернативный вариант fso.CopyFolder cur_dir & "\?_папка", fso.BuildPath(cur_dir, "Новый каталог_vbs"), true WScript.Echo "Процесс копирования завершен"
Теперь давайте рассмотрим, как работает данный программный код:
Сначала создается новая папка "Новый каталог_vbs" в текущей директории, далее идет цикл for, в котором есть 9 итераций, то есть, в текущей директории будет создаваться 9 папок с шаблонным названием.
- fso.CopyFolder cur_dir & "\?_папка", fso.BuildPath(cur_dir, "Новый каталог_vbs"), true – тут мы используем метод CopyFolder для копирования папок, мы задали шаблон "\?_папка", то есть первый символ может быть любым, далее идёт знак подчеркивания, и слово "папка". В качестве пути, куда мы будем производить копирование папок Windows, мы указали fso.BuildPath(cur_dir, "Новый каталог_vbs"), перед этим я указал альтернативный вариант указания пути, без использования метода BuildPath.
5 Ответ от JSmаn 2015-09-12 11:53:27
dmitriypopov86, пора бы уже выучить как оформляется заголовок темы.
Прежде чем приступать к программированию, давайте посмотрим, как скопировать папку в ручном режиме:
Как копировать файлы на диск
Хорошо, с одной теорией мы закончили, теперь можно приступить к другой И так, за копирование файлов на диск отвечает метод CopyFile класса FileSystemObject. Стоит учитывать, что данный метод производит одиночное копирование, то есть, нельзя начать копирование, нажать на паузу и потом снова продолжить. Его синтаксис следующий:
CopyFile (source, destination [,overwrite]) – как видим методу передаются три параметра, при этом, последний не является обязательным.
- source – данный параметр принимает строковое значение и указывает полный путь к файлу, который нужно скопировать, можно использовать подстановочные знаки: "?" – любой один символ и "*" – любое количество символов.
- destination – опять таки, полный путь, куда будет скопирован файл, при чём, можно указать новое имя и расширение.
- overwrite – если параметр установлен в логическое значение true – будет происходить замена, false – не производить замены (по умолчанию).
Хорошо, с теорией разобрались, теперь можно приступить к программированию. Для начала рассмотрим программный код на языке vbscript:
'********************************************** ' Объект filesystemobject метод copyfile ' Как копировать файлы на диск ' copyfile.vbs '********************************************** Option Explicit dim fso, new_folder ' создаем ссылку на объект Scripting.FileSystemObject set fso=CreateObject ("Scripting.FileSystemObject") ' создаем в текущей папке новый каталог set new_folder=fso.CreateFolder("Новая папка_vbs") ' копируем текущий сценарий в новую папку под новым именем fso.CopyFile WScript.ScriptFullName, new_folder & "\тест_vbs.txt" , true WScript.Echo "Процесс копирования завершен"
Давайте рассмотрим всё по пунктам. Сам сценарий производит создание папки "Новая папка_vbs" в текущем каталоге, для этого мы используем метод CreateFolder, после происходит копирование текущего файла (сценария) в созданную папку (метод CopyFolder класса FileSystemObject).
dim fso, new_folder – тут мы объявили переменные, fso – хранит ссылку на объект FileSystemObject, new_folder – хранит путь к новому каталогу.
set WshShell = CreateObject("Scripting.FileSystemObject ") – тут мы создаем ссылку на экземпляр объекта Wscript.Shell, тут мы используем стандартную функцию языка vbscript для создания ссылки на класс – CreateObject, также, как видим, фигурирует ключевое слово set. Объект нужен для использования метода CopyFile.
set new_folder=fso.CreateFolder("Новая папка_vbs") – тут происходит создание новой папки "Новая папка_vbs" с помощью метода CreateFolder, более детально, роботу данного метода я описал в статье "FileSystemObject метод CreateFolder". Как копировать файл на диск.
fso.CopyFile WScript.ScriptFullName, new_folder & "\тест_vbs.txt" , true – в данной строке мы производим процесс копирования текущего сценария в новый каталог, но уже под именем тест_vbs.txt. WScript.ScriptFullName содержит строку, которая определяет полный путь к текущему сценарию.
Стоит обратить внимание, что я не включал проверку ошибок.
Хорошо, теперь давайте рассмотрим аналогичный пример, но уже на языке jscript:
//********************************************** // Объект filesystemobject метод copyfile // Как копировать файлы на диск // copyfile.js //********************************************** var fso, new_folder; // создаем ссылку на объект Scripting.FileSystemObject fso=WScript.CreateObject ("Scripting.FileSystemObject"); // создаем в текущей папке новый каталог new_folder=fso.CreateFolder("Новая папка_js"); // копируем текущий сценарий в новую папку под новым именем fso.CopyFile (WScript.ScriptFullName, new_folder + "\\тест_js.txt" , true); WScript.Echo ("Процесс копирования завершен");
Тут я сделал некоторые изменения: изменил имя новой папки, имя конечного файла, в результате, произойдёт создание в текущей папке каталога "Новая папка_js", и копирование в нее текущего сценария, в итоге мы получим текстовый документ "тест_js.txt".
И так, в этой статье мы рассмотрели, как копировать файлы на диск с помощью метода CopyFile класса FileSystemObject. Для реализации поставленной задачи мы программировали на языке vbscript и jscript.
Спасибо за внимание. Автор блога Владимир Баталий
Как скопировать в папку
Сам метод показывает, как копировать папку с заменой и без замены. Кроме того, он копирует не только сами папки, но и все файлы, которые в них находятся, то есть, нам не надо использовать метод CopyFile объекта FileSystemObject. Также стоит обратить внимание, что метод CreateFolder, который нам нужен, что бы предварительно создать директории, вернёт ошибку, если такие директории уже есть – проблема решается включением обработчика ошибок языка vbscript.
Хорошо, продолжим программировать, и теперь напишем программный код для сценария на языке jscript:
//********************************************** // Объект FileSystemObject методы CopyFolder и BuildPath // Как скопировать папку на диск // CopyFolder.js //********************************************** var fso, new_folder, new_sub_folder, i; var WshShell, cur_dir; // формируем ссылку на объект WshShell = WScript.CreateObject("WScript.Shell"); // текущий каталог cur_dir = WshShell.CurrentDirectory; // создаем ссылку на объект FileSystemObject fso=WScript.CreateObject ("Scripting.FileSystemObject"); // как копировать в папку // создаем в текущей папке новый каталог new_folder=fso.CreateFolder("Новый каталог_js"); // циклично сздаем 9 папок for (i=10; i WScript.Echo ("Проверьте содержимое текущего каталога"); WScript.Echo ("Сейчас произойдет копирование 9 папок в каталог " + new_folder); // копируем 9 папок в другой каталог //fso.CopyFolder (cur_dir + "\\??_папка", cur_dir + "\\Новый каталог_js", true); fso.CopyFolder (cur_dir + "\\??_папка", fso.BuildPath(cur_dir, "Новый каталог_js"), true); WScript.Echo ("Процесс копирования завершен");
Данный пример альтернативен предыдущему с некоторыми изменениями, он также показывает, как скопировать папку на диск. Имена девяти новых папок будут начинаться с чисел от 10 до 19, это сделано, чтобы не создавать конфликт при создании каталогов, если вы перед этим запускали программный сценарий на языке vbscript. В конечном итоге, оба сценария будут производить копирование 9 папок в одну заданную директорию.
Стоит обратить внимание на одну особенность файловой системы Windows – общий путь не должен превышать 256 символов, начиная с корневого диска. Например, если путь к файлу вместе с его именем составляет 255 символов, а потом вы увеличите длину имени той директории, которая находится на уровень или несколько уровней выше, то уже не сможете получить доступ к конечной точке, так как общая длина будет превышать 256 символов.
Спасибо за внимание. Автор блога Владимир Баталий
По сути, сначала мы рассмотрим, как копировать файлы на диск в Windows ручным методом с помощью комбинаций клавиш и мышки, потом рассмотрим метод объекта FileSystemObject – CopyFile, который позволяет программным путём копировать файлы на диск или в указанную директорию, а потом начнём программировать.
И так, как копировать вручную файлы на диск? Да всё предельно просто, в зависимости от того, сколько нам нужно копировать файлов, мы можем выделить мышью один или несколько документов, а потом перетянуть их в другую папку или диск, предварительно удерживая клавишу "Ctrl", отпускаем левую кнопку мыши и всё, файлы скопированы. Второй способ – использование комбинации клавиш, снова выбираем нужные документы, нажимаем комбинацию "Ctrl + C", потом открываем нужную папку или диск и нажимаем комбинацию "Ctrl + V". Стоит помнить тот момент, что если мы попытаемся копировать файлы и вставить в одно и то же место ( скопировали на диске "С" и туда же хотим снова вставить ), то ошибки не произойдёт, система автоматически переименует вставляемые файлы, чтобы не возник конфликт имён.
2 Ответ от Flasher 2015-09-11 02:51:07 (изменено: Flasher, 2015-09-11 06:21:43)
- Flasher
- Заблокирован
- Неактивен
dmitriypopov86
Касаемо первый задачи: структура должна сохраняться, или всё кидать в одну папку? Если да, то букву диска не брать?
Это одноразовая задача? Насколько тут принципиален vbs?
А то можно было бы воспользоваться инструментарием Total Commander, например.
Ладно, я ждать уже не буду. Потом отпишитесь. Пока так (tempout.txt в UTF-16):
Читайте также: