Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование "удобняшек" на VBScript

Автор: Gavigor
Дата сообщения: 28.08.2009 16:00

Цитата:
bomzzz


-нужно скопировать папку если она есть
-если ее нет - значит ее не нужно копировать...зачем ее создавать? )))


Цитата:
kazavo4ka

...путь не найден... (это если в конце дописывать-а куда нужно то?)
Автор: bomzzz
Дата сообщения: 28.08.2009 16:02
значит вместо MsgBox ("нету папки") Quit 1

Добавлено:

Цитата:
Const FolderPath = "C:\" 'Путь к директории
Dim MyPath
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
MyPath = left (WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName)))
FSO.CopyFolder FolderPath, MyPath



я неделю про эти скрипты читаю и не могу сказать правильно ли написаное выделеное, мне такое не попадалось.


Цитата:

FolderPath = "C:\"
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
MyPath = WScript.Path
If fso.FolderExists(FolderPath) then FSO.CopyFolder FolderPath, MyPath


чета типа такого - проверять надо
Автор: kazavo4ka
Дата сообщения: 28.08.2009 16:44
Gavigor

Цитата:
...путь не найден... (это если в конце дописывать-а куда нужно то?)

в начале скрипта
Автор: Gavigor
Дата сообщения: 28.08.2009 16:58
ВСЕМ СПАСИБО!!! (отдельно
Цитата:
kazavo4ka
)
все работает !

Добавлено:
Подскажите пожалуйста еще по одному скриптику (Поиск и копирование по маске):

const FolderPath = "c:\" 'путь
Dim MyPath,f,f1,fc,ext
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
set f = fso.GetFolder(FolderPath)
set fc = f.Files
MyPath = left (WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName)))
for each f1 in fc
ext=lcase(fso.GetExtensionName(f1.path))
if (ext="txt") then 'Вместо txt укажи свою маску. Если несколько типов файлов: if (ext="txt") or (ext="doc") then
FSO.CopyFile f1.path, MyPath
end if
next

-что изменить чтобы поиск шел и в подпапках (SubFolder?)
-чтобы поиск шел и в C:\ и в D:\ ?
Автор: bomzzz
Дата сообщения: 28.08.2009 17:08
как работает то отпишись - мне самому интересно.
пытаюсь твой код понять
Автор: Gavigor
Дата сообщения: 28.08.2009 17:36
1
Автор: Gavigor
Дата сообщения: 29.08.2009 02:40
=задача изменилась-нужно найти и скопировать файл.
-как искать конкретный файл в C:\ и D:\ (в обеих дир) ?
-и как искать по всей директории?

On Error Resume Next
Const FolderPath = "C:\" 'Путь к директории
Dim MyPath
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
MyPath = left (WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName)))
FSO.CopyFile "Путь к файлу 1", MyPath
FSO.CopyFile "Путь к файлу 2", MyPath
FSO.CopyFile "Путь к файлу 3", MyPath
Автор: bomzzz
Дата сообщения: 29.08.2009 04:49

Цитата:

Const FolderPath = "C:\"
Set fso = CreateObject("Scripting.FileSystemObject")
if fso.FileExists(FolderPath & "MyFile") Then
Set mFile = fso.GetFile(FolderPath & "MyFile")
mFile.Copy WScript.Path & "MyFile", True
Else
MsgBox "Бяда! нету файлы, всё пропало"
End If


Автор: Gavigor
Дата сообщения: 29.08.2009 09:22
bomzzz

а что это?
ничего не ищется в подпапках....
Автор: bomzzz
Дата сообщения: 29.08.2009 09:40
Руководство разработчика на WSH 2.0 страница 306
по моему это батником проще сделать и вызвать его из вбс скрипа
Автор: Gavigor
Дата сообщения: 29.08.2009 11:15

Цитата:
bomzzz

черное окно батника не айс....

блин везде код с прописанными путями поиска и копирования....
Автор: bomzzz
Дата сообщения: 29.08.2009 11:22
читать надо, но вроде не умеет в подпапках искать, лучше прямо досовскую команду выполнить из скрипта, чтоб консольного окна не было - конвертни батник в екзешник (Bat To Exe Converter, или Quick Batch File Compiler). попробуй скрытым запустить из скрипта батник - я не пробовал. подумаешь окошко мелькнет.
Автор: Gavigor
Дата сообщения: 29.08.2009 11:49

Цитата:
но вроде не умеет в подпапках искать


искать умеет - рекурсивный перебор (как то так) - но че то я не догоняю как его прикрутить....

И как же сделать поиск файла с неизвестным путем...

И чтоб поиск шел и в С:\ и в D:\...
Автор: bomzzz
Дата сообщения: 29.08.2009 11:55
гугла все знаит

Добавлено:
ну я понял как только делать не буду

Цитата:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder("C:\Program Files")
For Each SubFolder In Folder.SubFolders
WScript.Echo SubFolder.Name
Next

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

Добавлено:
еще учти что в массиве не может быть больше 60 строк, если будешь какие нибудь списки директорий составлять. проще батником.

Добавлено:

Цитата:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder("C:\Program Files")
For Each SubFolder In Folder.SubFolders
Text = Text & SubFolder.Name & vbLf
Next
MsgBox Text

вот так наглядней у меня в высоту экрана не влазит.
Автор: Gavigor
Дата сообщения: 29.08.2009 12:58

Цитата:
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder("C:\Program Files")
For Each SubFolder In Folder.SubFolders
next


так...а как теперь сюда прикрутить поиск файла?
Автор: bomzzz
Дата сообщения: 29.08.2009 13:13
ну мне самому стало интересно стека хватит и можно ли byVal передавать не переменную, а ссылку на объект, я тут кое что уже набросал, но туплю с этой рекурсией как положено, и кино смотрю одним глазом может получица.

во я тормоз . работает.

Цитата:

Set FSO = CreateObject("Scripting.FileSystemObject")
MyFolderPath = "C:\Temp"
Call MyProcedure(MyFolderPath)
MsgBox "Фуххх!!!!"
Sub MyProcedure(FolderPath)
If fso.FileExists(FolderPath& "\" & "MyFile") Then
Set myFile = fso.GetFile(FolderPath & "\" & "MyFile")
myFile.Copy WScript.Path & "MyFile", True
MsgBox "Ура нашелся"
End If
Set MyFolder = FSO.GetFolder(FolderPath)
For Each SubFolder In MyFolder.SubFolders
MsgBox FolderPath & "\" & SubFolder.Name
Call MyProcedure(FolderPath & "\" & SubFolder.Name)
Next
End Sub

но только тут получается поверх скопируется последний файл с таким именем. возможно нет смысла искать после того как он найден. или типа такого

Добавлено:
вот зараза перебирает все подпапки но файл не копирует
исправил - но так разницу и не понял почему раньше без палки искало а теперь с палкой. с тебя бутылка
Автор: Gavigor
Дата сообщения: 29.08.2009 14:27
хреново блин...не получатся...

как же прописать поиск конкретного файла (с неизвестным путем) и скопировать его?...
Автор: bomzzz
Дата сообщения: 29.08.2009 14:31
ну вот перебирает все подпапки по алфавиту и копирует. только после копирования зря дальше перебирает. вот она рекурсия ета...

Добавлено:
ну вот в моем програм файл в котором 2798 папок в самой последней по алфавиту находит за несколько секунд.

Добавлено:

Цитата:

Set FSO = CreateObject("Scripting.FileSystemObject")
MyFolderPath = "C:\Program Files"
Call MyProcedure(MyFolderPath)
MsgBox "Фуххх!!!!"
Sub MyProcedure(FolderPath)
If fso.FileExists(FolderPath& "\" & "MyFile") Then
Set myFile = fso.GetFile(FolderPath & "\" & "MyFile")
myFile.Copy WScript.Path & "MyFile", True
MsgBox "Ура нашелся"
End If
Set MyFolder = FSO.GetFolder(FolderPath)
For Each SubFolder In MyFolder.SubFolders
Call MyProcedure(FolderPath & "\" & SubFolder.Name)
Next
End Sub

только тогда для опытов лучше без месаджбокса в каждой папке. 2 секунды

Добавлено:
я ж не знаю какая у тебя задача - если у тебя там много таких файлов с одинаковым именем ты присобачь переименование с нумером. а если такой файл один то после того как он нашелся можно из цикла выйти вот только я не знаю как коректно из середины процедуры тут выйти
Автор: Gavigor
Дата сообщения: 29.08.2009 15:43

Цитата:
я ж не знаю какая у тебя задача


задача найти один файл на компе и скопировать его....
т.е. вести поиск в папках до нахождения файла и потом скопировать его...
Автор: bomzzz
Дата сообщения: 29.08.2009 15:47
ну вот она решена. добавить разве удалить после копирования, окошко ввода для пути и имени в начале если это все что треубется от скрипа, ну и придумать как выйти после копирования если этот скрипт часть большого.
Автор: Gavigor
Дата сообщения: 29.08.2009 16:03
пишет разрешение отклонено в 12 строке...(


Цитата:
Set FSO = CreateObject("Scripting.FileSystemObject")
MyFolderPath = "C:\Program Files"
Call MyProcedure(MyFolderPath)
MsgBox "Фуххх!!!!"
Sub MyProcedure(FolderPath)
If fso.FileExists(FolderPath& "\" & "MyFile") Then
Set myFile = fso.GetFile(FolderPath & "\" & "MyFile")
myFile.Copy WScript.Path & "MyFile", True
MsgBox "Ура нашелся"
End If
Set MyFolder = FSO.GetFolder(FolderPath)
For Each SubFolder In MyFolder.SubFolders
Call MyProcedure(FolderPath & "\" & SubFolder.Name)
Next
End Sub



Добавлено:
MyFile - это искомый же?
Автор: bomzzz
Дата сообщения: 29.08.2009 16:15
да.

Добавлено:
у меня вообще то эти скрипты отключены из соображений безопасности и бесполезности. я конвертирую их в екзешники для использования. в принципе могут быть разночтения. так что я уверенно сказать что в таком виде скрипт будет работать не могу.
Автор: Gavigor
Дата сообщения: 29.08.2009 16:35
скрипт работает. просто когда я поменял пвапку поиска на C:\ - скрипт стал ошибку показывать. похоже на проблему с папками на которые только чтение.
Автор: bomzzz
Дата сообщения: 29.08.2009 16:44
хм. так он и читает только.

Добавлено:
у меня оказывается папка Темп на которой я експериментировал тоже только для чтения - ну и соответсвенно все вложенные тоже с такими свойствами - нормально читается и копируется

Добавлено:
да ты знаешь когда я поменял на С тоже выдало разрешение отклонено, это из за каких то системный папок. чтоб проверить надо чтоб при ошибке показало эту папку

Добавлено:
а может переполнение стека он тоже не резиновый
Автор: Gavigor
Дата сообщения: 29.08.2009 17:08
теперь он ищет и в System Volume Information (в смысле пропускает))):

Set FSO = CreateObject("Scripting.FileSystemObject")
MyFolderPath = "C:\"
Call MyProcedure(MyFolderPath)
MsgBox "Фуххх!!!!"
Sub MyProcedure(FolderPath)
If fso.FileExists(FolderPath& "\" & "3.txt") Then
Set myFile = fso.GetFile(FolderPath & "\" & "3.txt")
myFile.Copy WScript.Path & "3.txt", True
MsgBox "Ура нашелся"
End If
On Error Resume Next
For Each objFolder In objFolderForFind.SubFolders
If Err.Number = 0 Then
FindInSubFolders objFolder, strFileName

' Если при вызове метода .SubFolders получаем ошибку
' (например, на папке «System Volume Information», к которой, по умолчанию, доступ имеет только система),
' то просто пропускаем эту папку при обработке.
Else
Err.Clear
'WScript.Echo "Can't enumerate subfolders for folder [" & objFolderForFind.Path & "]"
End If
Next
On Error Resume Next
Set MyFolder = FSO.GetFolder(FolderPath)
For Each SubFolder In MyFolder.SubFolders
Call MyProcedure(FolderPath & "\" & SubFolder.Name)
Next
End Sub


осталось теперь только копирование найденного файла прикрутить....

Добавлено:
по поводу поиска:

-почему после того как нашел - вылезает фуух? или так и должно быть?
(т.е. если ура!!! - значит скрипт нашел искомый файл????)

Добавлено:
все - разобрался-работает все.

теперь копирование остается....

Добавлено:
-и еще бы не мешало прикрутить поиск и на D:\.......
Автор: bomzzz
Дата сообщения: 29.08.2009 17:24
а как ты папку определил? я как раз с этим ерор разбираюсь. понять не могу вообще в вбс скриптах переходы и метки есть или нет

Добавлено:
обратил кстати внимание что если путь из одного диска то две черточки получается
Автор: Gavigor
Дата сообщения: 29.08.2009 17:42

Цитата:
а как ты папку определил?


встретилось обсуждение этой проблемы на каком то форуме...)

все таки - не подскажешь - как копирование теперь прикрутить? и поиск по D:\?
Автор: bomzzz
Дата сообщения: 29.08.2009 17:48
If fso.FileExists(FolderPath& "\" & "3.txt") Then
Set myFile = fso.GetFile(FolderPath & "\" & "3.txt")
myFile.Copy WScript.Path & "3.txt", True

копирование вот эти строчки дают. если некопирует - выведи путь папки
добавь оператор MsgBox FolderPath вот сюда и разберись с количеством знаков обратного слеша \.

ну как прикрутить - просто еще раз запустить проверку с новой переменной. если у тебя этот скрипт не составная часть чего то добавь в начало
Path = InputBox("укажите путь для поиска", Title, "C:\", 100, 100)
MyFile = InputBox("Укажите имя файла", Title, "", 100, 100)
Автор: Gavigor
Дата сообщения: 29.08.2009 17:55
подскажи плиз - не догоняю куда приписать эти строки о копировании найденного файла.....((((

Добавлено:

Цитата:
копирование вот эти строчки дают.


почему не копирует ?.....

не знаешь что в этом скрипте нужно изменить чтобы он копировал найденный файл? (туда же где и сам скрипт находится (MyPatch?)).

подскажи плиз............((((((((((((((
Автор: bomzzz
Дата сообщения: 29.08.2009 18:07
If fso.FileExists(FolderPath& "\" & "MyFile") Then
Set myFile = fso.GetFile(FolderPath & "\" & "MyFile")
myFile.Copy WScript.Path & "MyFile", True
MsgBox "Ура нашелся"
End If
копируют вот эти строчки, в папку самого скрипа. у меня копирует. вернее копировало когда было c:\temp и програм файлс, но как ты можешь заметить в этих случаях путь не заканчивается \, а в случае c:\ заканчивается поэтому вот тута FolderPath & "\" & "MyFile" получаются лишние слеши. поэтому нужно в тело If Then добавить еще MsgBox FolderPath, чтобы вывелся путь откуда копироваться собралось и понять почему не копирует.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

Предыдущая тема: Работа в Delphi c CryptoApi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.