1

Тема: VBS: Создание ноль-копии папки

Решил сделать 'Создание нуль-копии папки, т.к. удобно пользоваться нуль-копией папки\папок, в которой сохранена вся структура вложенных папок и находящихся в них файлов с сохранением их названий, но все файлы имеют нулевой размер и не содержат ни какой информации. Но не получается создать нуль-копии файлов в их подпапках, а получает только в корневой папке нуль-копии. В чем ошибка?


papka = "f:\save_обработ2\"
 
Dim FSO, TextStream, Folder, SubFolder, File, FilePath
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder1 = FSO.GetFolder(papka)
Folder2 = Folder1.Name&"_Zero_"&CStr(Date)
If not FSO.FolderExists(Folder2) Then FSO.CreateFolder Folder2         'создаем "Zero_"+Folder1.Name

RecursiveFolderScan papka
Msgbox "ВСЕ!"



Sub RecursiveFolderScan(FolderPath)
    'Получаем объектную модель текущего каталога
    Set Folder = FSO.GetFolder(FolderPath)
 
    'Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files
FilePath = FSO.BuildPath(Folder2,File.Name)
Set TextStream =FSO.OpenTextFile(FilePath,2,True)
TextStream.Close
    Next
 
    'Перебираем все подкаталоги в каталоге
    For Each SubFolder in Folder.SubFolders
folderpath=FSO.BuildPath(Folder2,SubFolder.Name)
FSO.CreateFolder  folderpath

       RecursiveFolderScan(SubFolder.Path)

    Next
End Sub

2

Re: VBS: Создание ноль-копии папки

Option Explicit

Dim objFSO

Dim strSourceFolder
Dim strDestFolder
Dim objDestFolder


strSourceFolder = "E:\Песочница\0313"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
    strDestFolder = "E:\Песочница\0314"
    
    If Not objFSO.FolderExists(strDestFolder) Then
        Set objDestFolder = objFSO.CreateFolder(strDestFolder)
    Else
        Set objDestFolder = objFSO.GetFolder(strDestFolder)
    End If
    
    ScanSubFolders objFSO.GetFolder(strSourceFolder), objDestFolder
End If

WScript.Quit 0

Sub ScanSubFolders(objFolder, objDestFolder)
    Dim objFile
    Dim objSubFolder
    
    For Each objFile In objFolder.Files
        With objFSO.CreateTextFile(objFSO.BuildPath(objDestFolder.Path, objFile.Name))
            .Close
        End With
    Next

    For Each objSubFolder In objFolder.SubFolders
        ScanSubFolders objSubFolder, objFSO.CreateFolder(objFSO.BuildPath(objDestFolder.Path, objSubFolder.Name))
    Next
End Sub

Если же Вы хотите создавать «нуль-копии папки» в том же каталоге, который обрабатываете — то позаботьтесь о том, чтобы созданная папка-«нуль-копия» сама не попадала в обработку.

3 (изменено: griha09, 2013-08-20 19:52:56)

Re: VBS: Создание ноль-копии папки

Вообще-то "ноль-копия папки" создается в папке где находится скрипт. Спасибо за помощь.

4

Re: VBS: Создание ноль-копии папки

Вообще-то "ноль-копия папки" создается в папке где находится скрипт.

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

5 (изменено: Rumata, 2013-08-21 12:21:51)

Re: VBS: Создание ноль-копии папки

griha09
Для Вас принципиально использование VBS в данной задаче? Может быть имеет смысл воспользоваться средствами только CMD.EXE?

Запускаете скрипт (назовем его nulcopy.bat) с параметрами
old_dir - имя исходного копируемого каталога
new_dir - имя целевого каталога, где будет воспроизведена исходная структура


@echo off

:: Использование
:: nulcopy old_dir new_dir
::
:: Описание
:: Воспроизводит структуру каталога old_dir в каталоге new_dir. 
:: Целевой каталог должен быть создан до запуска скрипта. 
::
:: Пример
:: md "C:\Temp\1"
:: nulcopy "C:\Program Files" "C:\Temp\1"

setlocal enabledelayedexpansion

:: Проверить исходную и целевую директории
call :validate_dir "%~1" old_dir || goto :EOF
call :validate_dir "%~2" new_dir || goto :EOF

:: Создать структуру каталогов на новом месте
echo Creating a directory structure

for /f "tokens=*" %%L in ( '
    dir /b /s /ad "%old_dir%"
' ) do (
    set "line=%%L"
    set "line=!line:%old_dir%=%new_dir%!"
    call :mkdir "!line!"
)

:: Создать одноименные пустые файлы
echo Creating empty files

for /f "tokens=*" %%L in ( '
    dir /b /s /a-d "%old_dir%"
' ) do (
    set "line=%%L"
    set "line=!line:%old_dir%=%new_dir%!"
    call :touch "!line!"
)

endlocal
goto :EOF


:validate_dir
echo Validate "%~1"
pushd "%~1" || goto :EOF
set "%~2=%CD%"
popd
goto :EOF


:mkdir
md "%~1"
goto :EOF


:touch
set /p "p=" <nul >>"%~1"
goto :EOF

( 2 * b ) || ! ( 2 * b )

6

Re: VBS: Создание ноль-копии папки

Используя команду FORFILES можно существенно сократить код и время выполнения скрипта. В угоду читабельности : )

( 2 * b ) || ! ( 2 * b )

7

Re: VBS: Создание ноль-копии папки

Rumata пишет:

griha09
Для Вас принципиально использование VBS в данной задаче? Может быть имеет смысл воспользоваться средствами только CMD.EXE?

Да принципиально, т.к. с помощью CMD.EXE уже есть такой скрипт. Вот захотелось на VBS сделать.