Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Нужна помощь в корекции скрипта для копирования файлов (http://forum.oszone.net/showthread.php?t=216556)

streamrider 27-09-2011 10:49 1760895

Нужна помощь в корекции скрипта для копирования файлов
 
Добрый день уважаемые форумчане знатоки языка 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 1760954

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

Цитата:

Цитата streamrider
Но самое важное если указать диск C:\*.txt то он ищет только на "C" а как сделать что бы он искал по всему диску "C" включая под каталоги ? »

Посредством FSO — никак. В принципе, есть разные варианты. Но желательно услышать конкретную задачу целиком, в виде: «мне нужно сделать то-то и то-то».

streamrider 27-09-2011 14:03 1761012

Iska, Мне нужно сделать скрипт что бы он искал нужный мне файл на диске "C" включая под каталоги и скопировал его мне в папку .

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

Kazun 27-09-2011 14:34 1761035

http://blogs.technet.com/b/heyscript...-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 1761060

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 1761127

В дополнение. Копировать лучше методом 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 1761141

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

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

Iska 27-09-2011 17:46 1761213

Цитата:

Цитата SendMessage
Копировать лучше методом CopyHere. Поскольку у FSO будут проблемы с файлами read only. »

Поясните, пожалуйста.


streamrider, я тут посмотрел… Да, обязательно надо читать реестр и искать файл по указанному пути:
Цитата:

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


SendMessage 27-09-2011 18:18 1761238

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

streamrider 27-09-2011 19:16 1761271

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

strMyFolderPath = "parentfolder"

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

Iska 28-09-2011 00:08 1761470

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 1761506

Цитата:

Цитата Iska
Ну, дык, есть же свойство «.Attributes», есть DeleteFile с параметром Force — какие проблемы. »

Проблемы у метода копирования файла. А после дополнительных танцев с бубном можно всё преодолеть, тут спорить не о чем.

Iska 28-09-2011 02:14 1761508

SendMessage, согласен.


Время: 05:10.

Время: 05:10.
© OSzone.net 2001-