View previous topic :: View next topic |
Author |
Message |
jehaz
Joined: 24 May 2006 Posts: 16
|
(Separately) Posted: Fri Aug 10, 2007 21:49 Post subject: |
|
|
Скрипт копирует множество файлов во множество папок. Вешаем на кнопку, в параметрах указываем %L, далее выделяем файлы, жмем на кнопку, потом выделяем папки и еще раз жмем на кнопку. Выделенные файлы будут скопированы в выделенные папки. Что бы выделить папки, разбросанные в разных местах по разным дискам, используем прекрасную возможность выделять папки во время установки вида "Дерево каталогов".
С WHS только знакомлюсь, поэтому возможно не совсем по правилам написан скрип, но работает. И еще возникает исключение, если во время выделения файлов выделить каталог. Пока не догнал как исправить. Script Helper не использует, поэтому возможна работа с Total commander установленном на флешке.
Code: | Set WshArg = WScript.Arguments
If WshArg.Count>0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
aargument = WshArg.Item(0)
Set WSHShell = CreateObject("WScript.Shell")
Set ObjEnv = WSHShell.Environment("Process")
ttemp = ObjEnv("TEMP")
ppath = ttemp & "\filelisttemp.txt"
If FSO.FileExists (ppath) then
Set folderlist = FSO.getfile(aargument)
Set ffilelist = FSO.getfile(ppath)
Set msgfiles = ffilelist.OpenAsTextStream(1)
Set msgfolders = folderlist.OpenAsTextStream(1)
msgfilestext = msgfiles.ReadAll()
msgfolderstext = msgfolders.ReadAll()
result = MsgBox("Будем копировать?" & vbCrLf & "файлы:" & vbCrLf & msgfilestext & vbCrLf & "в папки:" & vbCrLf & msgfolderstext,36,"Внимание!")
msgfolders.Close
msgfiles.Close
If result = 6 then
Set TextStream = folderlist.OpenAsTextStream(1)
StrFolder = vbNullString
While Not TextStream.AtEndOfStream
StrFolder = TextStream.ReadLine()
Set TextStreamFL = ffilelist.OpenAsTextStream(1)
StrFiles = vbNullString
While Not TextStreamFL.AtEndOfStream
StrFiles = TextStreamFL.ReadLine()
Set copyfilename = FSO.getfile(strfiles)
copyfilename.Copy strfolder
Wend
TextStreamFL.Close
Wend
TextStream.Close
MsgBox "Скопировано",48,"Внимание!"
End If
FSO.deletefile ppath, 0
else
Set ffile = FSO.GetFile(aargument)
ppath = ttemp & "\filelisttemp.txt"
ffile.Copy ppath
MsgBox "Список файлов для копирования создан!"
End If
End If
|
|
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Mon Aug 13, 2007 15:58 Post subject: |
|
|
jehaz wrote: | И еще возникает исключение, если во время выделения файлов выделить каталог. Пока не догнал как исправить. |
Ошибка здесь:
Code: | StrFiles = TextStreamFL.ReadLine()
Set copyfilename = FSO.getfile(strfiles)
copyfilename.Copy strfolder |
Сделай:
Code: | StrFiles = TextStreamFL.ReadLine()
If FSO.FileExists(StrFiles) Then
FSO.CopyFile StrFiles, strfolder
End If
If FSO.FolderExists(StrFiles) Then
FSO.CopyFolder StrFiles, strfolder
End If
|
А еще также хорошо-бы проверять, что strfolder - папка, а не файл. |
|
Back to top |
|
|
jehaz
Joined: 24 May 2006 Posts: 16
|
(Separately) Posted: Mon Aug 13, 2007 20:41 Post subject: |
|
|
Немного отрихтовал свой скрипт. Теперь он копирует любое количество файлов и папок в любое количество папок. Спасибо Batya за подсказку как отсортировать файлы от папок. Пригодилось. Возможно есть мусор - пока мало опыта. Подсказывайте.
Code: | '===========================================================
'Скрипт копирует любое количество файлов и папок в
'любое количество папок. Не требует Script Helper.
'В параметрах к запуску указать %L
'Выделить объекты (файлы, папки) "что копировать", жмем
'кнопку. Далее выделяем папки "куда копировать", жмем кнопку.
'Если при выделении папок "куда копировать" ничего не выделено,
'скрипт прекращает работу. Или если при выделении папок
'"куда копировать" выделены файлы, то они игнорируются.
'===========================================================
Option Explicit
Dim Argument
Dim Tempdir, PathTempFile, FolderList, FileList, MsgFoldersStr, MsgFileText, MsgFolders
Dim MsgFoldersText, StrFolder, StrFiles, CopyFileName, MsgFileStr
Dim Lenstr, LastChar, Result, FileListFile
Dim WshArg, FSO, WSHShell, ObjEnv, TextStreamFL, TextStream, ObjShellApp, CopyObj
Set WshArg = WScript.Arguments
Set ObjShellApp = CreateObject("Shell.Application")
If WshArg.Count>0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
Argument = WshArg.Item(0)
Set WSHShell = CreateObject("WScript.Shell")
Set ObjEnv = WSHShell.Environment("Process")
Tempdir = ObjEnv("TEMP")
PathTempFile = Tempdir & "\FileListTemp.txt"
If FSO.FileExists (PathTempFile) then
Set FolderList = FSO.getfile(Argument)
Set FileList = FSO.getfile(PathTempFile)
Set TextStream = FolderList.OpenAsTextStream(1)
MsgFoldersStr = vbNullString
MsgFoldersText = vbNullString
While Not TextStream.AtEndOfStream
MsgFoldersStr = TextStream.ReadLine()
If FSO.FolderExists(MsgFoldersStr) Then
MsgFoldersText = MsgFoldersText & MsgFoldersStr & vbCrLf
End If
Wend
TextStream.Close
Set MsgFileStr = FileList.OpenAsTextStream(1)
MsgFileText = MsgFileStr.ReadAll()
If MsgFoldersText <> "" then
Result = MsgBox("Будем копировать?" & vbCrLf & "объекты:" & vbCrLf & MsgFileText & vbCrLf & "в папки:" & vbCrLf & MsgFoldersText,36,"Внимание!")
Else
MsgBox "Не выделены папки для для копирования!!!" & vbCrLf & "Временные файлы удалены!" & vbCrLf & "Работа скрипта завершена!",48,"Внимание!!!"
End If
MsgFileStr.Close
If Result = 6 then
Set TextStream = FolderList.OpenAsTextStream(1)
StrFolder = vbNullString
While Not TextStream.AtEndOfStream
StrFolder = TextStream.ReadLine()
Set TextStreamFL = FileList.OpenAsTextStream(1)
StrFiles = vbNullString
While Not TextStreamFL.AtEndOfStream
StrFiles = TextStreamFL.ReadLine()
If FSO.FolderExists (StrFolder) Then
Set CopyObj = ObjShellApp.NameSpace(StrFolder)
CopyObj.CopyHere StrFiles,20
End If
Wend
TextStreamFL.Close
Wend
TextStream.Close
MsgBox "Скопировано...",48,"Внимание!"
End If
FSO.deletefile PathTempFile, 0
else
Set FileListFile = FSO.GetFile(Argument)
PathTempFile = Tempdir & "\FileListTemp.txt"
FileListFile.Copy PathTempFile
MsgBox "Список файлов для копирования создан!",48,"Внимание!!!"
End If
End If
WScript.Quit |
|
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Aug 14, 2007 10:35 Post subject: |
|
|
jehaz wrote: | Возможно есть мусор - пока мало опыта. Подсказывайте. |
Первое и ОЧЕНЬ важное - форматируй текст кода отступами! Если ты сам при небольшом объеме еще можешь разобраться, то читать код другим просто невозможно и совсем неинтересно. Наверное, если бы код был более читабельным, то еще кто-нибудь, кроме меня, мог поучаствовать в обсуждении.
Второе - вставляй комментарии и пустые строки. Это помогает визуально разделить код на блоки.
Далее...
Зачем 2 раза открывать TextStream с именами папок, если у тебя уже сохранен массив папок в MsgFoldersText?
Смысл тот же, но я бы этот код
Code: | While Not TextStream.AtEndOfStream
MsgFoldersStr = TextStream.ReadLine()
If FSO.FolderExists(MsgFoldersStr) Then
MsgFoldersText = MsgFoldersText & MsgFoldersStr & vbCrLf
End If
Wend |
записал так (обрати вимание на отступы!!!)
Code: | While Not TextStream.AtEndOfStream
MsgFoldersStr = TextStream.ReadLine()
If FSO.FolderExists(MsgFoldersStr) Then
MsgFoldersText = MsgFoldersText & vbCrLf & MsgFoldersStr
End If
Wend
' Отбрасываем лидирующий vbCrLf
MsgFoldersText = Mid(MsgFoldersText, 3)
|
Соответственно, потом можно вместо
Code: | Set TextStream = FolderList.OpenAsTextStream(1)
StrFolder = vbNullString
While Not TextStream.AtEndOfStream
... |
использовать
Code: | For Each StrFolder In Split(MsgFoldersText, vbCrLf)
... |
Потом тебе и
Code: | If FSO.FolderExists (StrFolder) Then |
не понадобится.
И еще - хорошо бы в MsgBox использовать не числовые значения, а vb-константы.
P.S. В принципе, я тоже не крутой программер, но vbs-ом увлекаюсь уже давно, и весь опыт приобретен не из книжек, а на основе "проб и ошибок".
Добавлено: Поправил немного (ступил, однако). |
|
Back to top |
|
|
jehaz
Joined: 24 May 2006 Posts: 16
|
(Separately) Posted: Thu Aug 16, 2007 20:39 Post subject: |
|
|
Batya wrote: |
Первое и ОЧЕНЬ важное - форматируй текст кода отступами! Если ты сам при небольшом объеме еще можешь разобраться, то читать код другим просто невозможно и совсем неинтересно. Наверное, если бы код был более читабельным, то еще кто-нибудь, кроме меня, мог поучаствовать в обсуждении.
|
Торопился скорее реализовать. Исправился.
Batya wrote: |
Соответственно, потом можно вместо
Code: | Set TextStream = FolderList.OpenAsTextStream(1)
StrFolder = vbNullString
While Not TextStream.AtEndOfStream
... |
использовать
Code: | For Each StrFolder In Split(MsgFoldersText, vbCrLf)
... |
Потом тебе и
Code: | If FSO.FolderExists (StrFolder) Then |
не понадобится.
|
Тут в принципе согласен, но лучше еще раз проверить физическое наличие папок. В другой копии тотала можно выполнять операцию удаления и забыть. А тут контроль.
Batya wrote: |
И еще - хорошо бы в MsgBox использовать не числовые значения, а vb-константы.
|
Сделано.
Batya wrote: |
Добавлено: Поправил немного (ступил, однако). |
Заметил. "Ввод данных за пределами файла". Было было.
Ну вот наверное конечный вариант. Только отформатировал.
Даже если оставишь выделение какое было в "что копировать" то папки сами в себя не копируются. Оболочка следит.
Code: | '===========================================================
' Скрипт копирует любое количество файлов и папок в
' любое количество папок. Не требует Script Helper.
' В параметрах к запуску указать %L
' Выделить объекты (файлы, папки) "что копировать", жмем
' кнопку. Далее выделяем папки "куда копировать", жмем кнопку.
' Если при выделении папок "куда копировать" ничего не выделено,
' скрипт прекращает работу. Или если при выделении папок
' "куда копировать" выделены файлы, то они игнорируются.
'===========================================================
Option Explicit
Dim Argument
Dim Tempdir, PathTempFile, FolderList, FileList, MsgFoldersStr, MsgFileText, MsgFolders
Dim MsgFoldersText, StrFolder, StrFiles, CopyFileName, MsgFileStr
Dim Lenstr, LastChar, Result, FileListFile
Dim WshArg, FSO, WSHShell, ObjEnv, TextStreamFL, TextStream, ObjShellApp, CopyObj
Set WshArg = WScript.Arguments
Set ObjShellApp = CreateObject("Shell.Application")
If WshArg.Count>0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
Argument = WshArg.Item(0)
Set WSHShell = CreateObject("WScript.Shell")
Set ObjEnv = WSHShell.Environment("Process")
Tempdir = ObjEnv("TEMP")
PathTempFile = Tempdir & "\FileListTemp.txt"
If FSO.FileExists (PathTempFile) then
Set FolderList = FSO.getfile(Argument)
Set FileList = FSO.getfile(PathTempFile)
Set TextStream = FolderList.OpenAsTextStream(1)
MsgFoldersStr = vbNullString
MsgFoldersText = vbNullString
While Not TextStream.AtEndOfStream
MsgFoldersStr = TextStream.ReadLine()
If FSO.FolderExists(MsgFoldersStr) Then
MsgFoldersText = MsgFoldersText & MsgFoldersStr & vbCrLf
End If
Wend
TextStream.Close
Set MsgFileStr = FileList.OpenAsTextStream(1)
MsgFileText = MsgFileStr.ReadAll()
If MsgFoldersText <> "" then
Result = MsgBox("Будем копировать?" & vbCrLf & "объекты:"_
& vbCrLf & MsgFileText & vbCrLf & "в папки:" & vbCrLf & _
MsgFoldersText,vbYesNo+vbQuestion,"Внимание!")
Else
MsgBox "Не выделены папки для для копирования!!!" & vbCrLf & _
"Временные файлы удалены!" & vbCrLf & "Работа скрипта завершена!"_
,vbExclamation,"Внимание!!!"
End If
MsgFileStr.Close
If Result = 6 then
Set TextStream = FolderList.OpenAsTextStream(1)
StrFolder = vbNullString
While Not TextStream.AtEndOfStream
StrFolder = TextStream.ReadLine()
Set TextStreamFL = FileList.OpenAsTextStream(1)
StrFiles = vbNullString
While Not TextStreamFL.AtEndOfStream
StrFiles = TextStreamFL.ReadLine()
If FSO.FolderExists (StrFolder) Then
Set CopyObj = ObjShellApp.NameSpace(StrFolder)
CopyObj.CopyHere StrFiles,20
End If
Wend
TextStreamFL.Close
Wend
TextStream.Close
MsgBox "Скопировано...",vbExclamation,"Внимание!"
End If
FSO.deletefile PathTempFile, 0
else
Set FileListFile = FSO.GetFile(Argument)
PathTempFile = Tempdir & "\FileListTemp.txt"
FileListFile.Copy PathTempFile
MsgBox "Список файлов для копирования создан!",vbExclamation,"Внимание!!!"
End If
End If
WScript.Quit |
|
|
Back to top |
|
|
xmass
Joined: 02 Sep 2007 Posts: 2
|
(Separately) Posted: Wed Sep 05, 2007 20:19 Post subject: |
|
|
При запуске всех скриптов у меня общая беда:
Подскажите, что делать ?
Файлы копируются нормально - папки плохо ...
При выполнении скрипта, внутри выбранной папки ("ЧТО копирую") появляются первые две папки из директории "КУДА копирую": одна папка с файлами, другая пустая ... и в таком виде файлы копируются во все папки "КУДА копирую" ... |
|
Back to top |
|
|
xmass
Joined: 02 Sep 2007 Posts: 2
|
(Separately) Posted: Fri Sep 07, 2007 18:51 Post subject: |
|
|
Разобрался - проблема исчезла.
Скрипт от Batya 100% рабочий и ОЧЕНЬ быстрый,
но для его работы надо строго выполнить 2 условия:
1) Установить программы Script Helper и KillCopy (в сообщениях от Batya есть где найти).
2) Во время использования скрипта строго следовать инструкции:
С одной стороны выделаешь папки куда копируешь, с другой - файлы и папки, которые копируешь.
Скрипт выполняешь, когда активна панель, где выделено, что копировать.
Спасибо Batya ! |
|
Back to top |
|
|
Kavar
Joined: 06 May 2005 Posts: 112 Location: Южная Сибирь
|
(Separately) Posted: Mon Mar 15, 2010 11:59 Post subject: |
|
|
А нет скрипта, где папки-приемники брались бы из текстового файла? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Mar 15, 2010 12:25 Post subject: |
|
|
Kavar
Нужно как-то подоходчивей. Что-то вроде:
Можно ли поменять скрипт(или предоставить, если таковой уже имеется), чтобы выделенные папки и файлы копировались в каталоги, указанные в файле-списке, где пути к ним располагаются один под другим? >>
С:\Folder1
C:\Folder2
...
Last edited by Flasher on Mon Mar 15, 2010 12:27; edited 1 time in total |
|
Back to top |
|
|
Kavar
Joined: 06 May 2005 Posts: 112 Location: Южная Сибирь
|
(Separately) Posted: Mon Mar 15, 2010 12:26 Post subject: |
|
|
Flasher, да, именно это я и имел в виду |
|
Back to top |
|
|
Booroondook
Joined: 28 Nov 2011 Posts: 2
|
(Separately) Posted: Mon Nov 28, 2011 06:13 Post subject: |
|
|
Batya wrote: | LocKtaR-o-DarK предложил создать скрипт для копирования нескольких файлов...
Скрипт *.vbs:
Code: | '========================================================
' Копирование выделенных файлов в несколько каталогов
' Параметры вызова из TC:
' %L
'========================================================
If WScript.Arguments.Count = 0 Then
MsgBox "Не заданы параметры!", vbOKOnly + vbExclamation, "Копирование в несколько каталогов"
WScript.Quit
End If
Dim TCS, WSH, Targets, TargStr
Set TCS = CreateObject("TCScript.Helper")
Set WSH = CreateObject("WScript.Shell")
Targets = TCS.GetTrgSelectedFiles(1)
TargStr = Join(Targets, "?")
WSH.Run "killcopy.exe |" & WScript.Arguments(0) & "|" & TargStr & "| -n", , 1
Set TCS = Nothing
Set WSH = Nothing
WScript.Quit |
Как действует - выделяем каталоги КУДА копировать, переключаемся на другую панель, выделяем ЧТО копировать, запускаем скрипт. |
Облазил справку и поиск по инету, но так и не нашёл, как назначить команду кнопке. Подскажите пожалуйста. |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10259 Location: Россия, Саратов
|
(Separately) Posted: Mon Nov 28, 2011 07:35 Post subject: |
|
|
Booroondook
Во-первых ненужное цитирование (в том числе и полное цитирование чужих скриптов) категорически не приветствуется. Раз нет возможности указать ссылку (как у новичка), достаточно было в данном случае просто упомянуть последний пост на предыдущей странице. Если такое упоминание вообще нужно (в данном посте — нет).
Что такое "Назначить команду кнопке", могу только догадываться. Это кнопку назначают команде, а не наоборот. Про код кнопки (ищем по форуму!) сказано многократно. Про то, как использовать vbs-скрипты — тоже. Про то, какие команды и как указывать в кнопке — как минимум, в справке.
Короче, говоря, читаем правила форума. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
Booroondook
Joined: 28 Nov 2011 Posts: 2
|
(Separately) Posted: Mon Nov 28, 2011 08:32 Post subject: |
|
|
Avada, если бы я не привёл код который мне нужно привязать к кнопке, посыпались бы сообщения "всё зависит от кода...", "мы не знаем, приведи пример кода..." и т.д, поэтому чтобы снять подобные вопросы, сразу привел код.
Про то, как правильней, "команду кнопке" или "кнопку команде" я думаю дело вкуса, суть от этого не меняется.
Я не зря сказал, что через поиск найти не получилось, попробуйте сами. Выдаётся куча всего не по теме.
Я понимаю конечно, что тут много гуру и всё такое, но у меня нет времени заниматься штудированием форумов и доскональным изучением программ, мне хочется ими пользоваться. Так, чтобы было удобно. Если вы знаете как назначить скрипт кнопке (или наоборот), то почему бы вам просто мне не подсказать. |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10259 Location: Россия, Саратов
|
(Separately) Posted: Mon Nov 28, 2011 09:44 Post subject: |
|
|
Booroondook
Для сведения: здесь никто никому не обязан пояснять очередной раз то, что уже было разжёвано десятки раз со всеми мыслимыми и немыслимыми подробностями и вполне успешно находится поиском по форуму. Более того, это прямо противоречит правилам форума.
Приведён не был не код кнопки, а текст скрипта. Что с этим (или любым другим, независимо от содержания) скриптом дальше делать, объяснялось на форуме не один раз (всего один из многих примеров, найденных хотя бы по файл vbs или по код скрипта с последующим чтением заголовков тем).
Дискуссия закончена. Замечание за повторное нарушение правил форума (пререкание с модератором и оффтоп). О дальнейших последствиях в случае продолжения в том же духе читаем в правилах.
P.S. В шапке подфорума теперь есть памятка для новичков по работе со скриптами. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
master2005
Joined: 23 Jan 2012 Posts: 1
|
(Separately) Posted: Mon Jan 23, 2012 12:02 Post subject: |
|
|
Хоть топик и старый, но вопрос актуален.
Проблема такая - скрипты от Batya и jehaz отлично работают на локальной машине winXP, но мне необходимо копировать файлы по ФТП на серваке под линуксом.
В этом случае почему то оба скрипта не работают - скрипт от jehaz - пишет что "Не выделены папки для копирования!", при запуске скрипта от Бати - KillCopy выдает ошибку "File write error 6 - Неверный дескриптор".
Прошу помощи. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|