Показать полную графическую версию : [решено] Нужна помощь в корекции скрипта для копирования файлов
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 "Все комманды успешно выполнены"
streamrider, в FSO нет средств для поиска по маске, только перебором. Вариант разбора и использования результатов «DIR <mask>» возможен, но может приводить к некорректным результатам — я его не рекомендую. То, что привели Вы («FSO.CopyFile "C:\*.txt"») — это не поиск, а отбор файлов.
Но самое важное если указать диск C:\*.txt то он ищет только на "C" а как сделать что бы он искал по всему диску "C" включая под каталоги ? »
Посредством FSO — никак. В принципе, есть разные варианты. Но желательно услышать конкретную задачу целиком, в виде: «мне нужно сделать то-то и то-то».
streamrider
27-09-2011, 14:03
Iska, Мне нужно сделать скрипт что бы он искал нужный мне файл на диске "C" включая под каталоги и скопировал его мне в папку .
Задача в общем такая мне нужен скрипт который при запуске искал файл hosts в директории Windows и потом найдя его скопировал его мне в мою папку . Это все нужно мне для моей программы которая редактирует с нужными параметрами это файлик а поскольку прямой доступ не разрешен к папке system32 мне нужно его скопировать и потом прога получив доступ вносила изменения и снова заменяла его обратно . ПО готово а вот скрипт нет (((
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
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, И вам огромное спасибо это как раз то что нужно )))))))))
Копировать лучше методом 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"
В ответ ошибка
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 — какие проблемы. »
Проблемы у метода копирования файла. А после дополнительных танцев с бубном можно всё преодолеть, тут спорить не о чем.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.