Войти

Показать полную графическую версию : [решено] Нужна помощь в корекции скрипта для копирования файлов


streamrider
27-09-2011, 10:49
Добрый день уважаемые форумчане знатоки языка VBS . Ребята в общем проблема такая я только учусь писать скрипты и решил написать скрипт для поиска файлов по маске и копирования в созданную папку так вот проблема в том что он у меня ищет только если есть конкретный путь а если его нет то сразу "ошибка" Как сделать что бы он находил сам директорию на дисках без указания точного пути. Но самое важное если указать диск C:\*.txt то он ищет только на "C" а как сделать что бы он искал по всему диску "C" включая под каталоги ?

В общем то вопроса 2 :
1)Как мне указать относительный путь
2)И как сделать поиск по всему каталогу

Вот мой код скрипта :

set FSO=CreateObject("Scripting.FileSystemObject")
set file=fso.getfile(wscript.scriptfullname)
FSO.CreateFolder file.parentfolder+"\BACKUP"
FSO.CopyFile "C:\*.txt", file.parentfolder+"\BACKUP"
msgbox "Все комманды успешно выполнены"

Iska
27-09-2011, 12:27
streamrider, в FSO нет средств для поиска по маске, только перебором. Вариант разбора и использования результатов «DIR <mask>» возможен, но может приводить к некорректным результатам — я его не рекомендую. То, что привели Вы («FSO.CopyFile "C:\*.txt"») — это не поиск, а отбор файлов.

Но самое важное если указать диск C:\*.txt то он ищет только на "C" а как сделать что бы он искал по всему диску "C" включая под каталоги ? »
Посредством FSO — никак. В принципе, есть разные варианты. Но желательно услышать конкретную задачу целиком, в виде: «мне нужно сделать то-то и то-то».

streamrider
27-09-2011, 14:03
Iska, Мне нужно сделать скрипт что бы он искал нужный мне файл на диске "C" включая под каталоги и скопировал его мне в папку .

Задача в общем такая мне нужен скрипт который при запуске искал файл hosts в директории Windows и потом найдя его скопировал его мне в мою папку . Это все нужно мне для моей программы которая редактирует с нужными параметрами это файлик а поскольку прямой доступ не разрешен к папке system32 мне нужно его скопировать и потом прога получив доступ вносила изменения и снова заменяла его обратно . ПО готово а вот скрипт нет (((

Kazun
27-09-2011, 14:34
http://blogs.technet.com/b/heyscriptingguy/archive/2005/04/08/how-can-i-get-a-list-of-all-the-pst-files-on-a-computer.aspx

Только изменить WMI запрос,указав диск C: и имя файла.

("Select * From CIM_DataFile Where FileName = 'Budget' " & _
"AND Extension = 'txt' AND Drive = '" & strDrive & "'")


А для случая с hosts,можно запросить ключ реестра и определить папку - HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DatabasePath

Iska
27-09-2011, 14:58
Kazun, только чертовски медленно будет искать.

streamrider, зачем его искать, если всегда известно, где он находится?
Option Explicit

Const SystemFolder = 1

Dim strPath


With WScript.CreateObject("Scripting.FileSystemObject")
strPath = .BuildPath(.GetSpecialFolder(1).Path, "drivers\etc\hosts")

If .FileExists(strPath) Then
WScript.Echo "Found: " & strPath
End If
End With

WScript.Quit 0

SendMessage
27-09-2011, 16:01
В дополнение. Копировать лучше методом CopyHere. Поскольку у FSO будут проблемы с файлами read only. Пример:
Option Explicit

Dim strMyFolderPath
Dim objShell
Dim objMyFolder
Dim objHostsFolder

strMyFolderPath = "z:\myfolder"

Set objShell = CreateObject("Shell.Application")

Set objMyFolder = objShell.NameSpace(strMyFolderPath)
Set objHostsFolder = objShell.NameSpace(objShell.NameSpace(&H25).ParseName("drivers\etc"))

' Копирование:
' из системной в свою
objMyFolder.CopyHere objHostsFolder.Self.Path & "\hosts", 20
' из своей в системную
objHostsFolder.CopyHere objMyFolder.Self.Path & "\hosts", 20

streamrider
27-09-2011, 16:18
Спасибо огромное за помощь и за код для поиска )))) Осталось теперь поколдовать чтол бы этот код совместить с копированием по пути полученному этой функцией от Iska,

SendMessage, И вам огромное спасибо это как раз то что нужно )))))))))

Iska
27-09-2011, 17:46
Копировать лучше методом CopyHere. Поскольку у FSO будут проблемы с файлами read only. »
Поясните, пожалуйста.

streamrider, я тут посмотрел… Да, обязательно надо читать реестр и искать файл по указанному пути:
А для случая с hosts,можно запросить ключ реестра и определить папку - HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DatabasePath »

SendMessage
27-09-2011, 18:18
Iska, если файл назначения имеет установленный атрибут «read only», метод objFSO.CopyFile (а также и objFSO.GetFile(filename).Copy) не сможет заменить этот файл, даже если параметр OverWrite выставлен True (что, впрочем, и есть по умолчанию).

streamrider
27-09-2011, 19:16
SendMessage, А как описать strMyFolderPath = "z:\myfolder" что бы копирование шло в ту директорию где лежит сам скрипт ??? Я делал так :

strMyFolderPath = "parentfolder"

В ответ ошибка

Iska
28-09-2011, 00:08
SendMessage, спасибо, ясно. Ну, дык, есть же свойство «.Attributes», есть DeleteFile с параметром Force — какие проблемы.

streamrider, примерно так:
Option Explicit

Const strFileName = "hosts"

Const SystemFolder = 1
Const HKEY_LOCAL_MACHINE = &H80000002

Dim strPath
Dim strFullFileName
Dim strNewFullFileName


With WScript.CreateObject("Scripting.FileSystemObject")
If WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\default").Get("StdRegProv").GetStringValue( _
HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters", "DataBasePath", strPath) = 0 Then

WScript.Echo "Found parameter [DataBasePath]"
Else
strPath = .BuildPath(.GetSpecialFolder(1).Path, "drivers\etc")
WScript.Echo "Can't found parameter [DataBasePath], try default path as [" & strPath & "]"
End If

strFullFileName = .BuildPath(strPath, strFileName)
strNewFullFileName = .BuildPath(.GetParentFolderName(WScript.ScriptFullName), strFileName)

If .FileExists(strFullFileName) Then
If .FileExists(strNewFullFileName) Then
.DeleteFile strNewFullFileName, True
End If

.CopyFile strFullFileName, strNewFullFileName, True

If .FileExists(strNewFullFileName) Then
WScript.Echo "Found [" & strFullFileName & "] and copied to [" & strNewFullFileName & "]"
Else
WScript.Echo "Found [" & strFullFileName & "] but can't copy to [" & strNewFullFileName & "]"
End If
Else
WScript.Echo "File [" & strFullFileName & "] not found"
End If
End With

WScript.Quit 0

SendMessage
28-09-2011, 01:56
Ну, дык, есть же свойство «.Attributes», есть DeleteFile с параметром Force — какие проблемы. »
Проблемы у метода копирования файла. А после дополнительных танцев с бубном можно всё преодолеть, тут спорить не о чем.

Iska
28-09-2011, 02:14
SendMessage, согласен.




© OSzone.net 2001-2012