Компьютерный форум 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=256082)

gora 12-03-2013 10:26 2109127

Нуль-копия папки для выкладывания на форуме.
 
На этом форуме часто приходится наблюдать следующую картину. ТС пытается сформулировать свою задачу и "на пальцах" объяснить в каких папках у него находятся файлы\папки, которые ему требуется обработать соответствующим образом. Оценить структуру папок\файлов, их взаимное расположение, их имена и расширения, а также отсутствие в именах спец. символов, по такому описанию бывает крайне затруднительно. Переписка с ТС и выяснение всех деталей структуры занимает порой большую часть ветки и "напрягает" отвечающих созданием ненужных для ТС вариантов скриптов, основанных на гаданиях\предположениях.
Гораздо удобнее было бы увидеть эту структуру, но папки и файлы в них могут иметь большой размер или содержать конфиденциальную информацию. Для таких случаев удобно пользоваться нуль-копией папки\папок, в которой сохранена вся структура вложенных папок и находящихся в них файлов с сохранением их названий, но все файлы имеют нулевой размер и не содержат ни какой информации.

Предлагаю вариант скрипта для создания такой нуль-копии папки:
Код:

@Echo Off
ChCp 1251>Nul
If
"%~1"=="" (
        Echo The correct syntax:
        Echo %~nx0 "Full\path\to\Folder 1" ["Full\path\to\Folder 2"] ...
        Pause>Nul
        Exit

)
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set t=%%i
Set zDT=_Zero_%t:~2,2%%t:~4,2%%t:~6,2%_%t:~8,2%-%t:~10,2%
Set f=%~1& Set cnt=2& Set c=0& Set cf=0
:_loop
        If "%f:~0,1%"=="\" Set /A cnt+=1
        Set f=%f:~1%
If Defined f GoTo _loop
Set /A cntI=cnt-1

If "%~2"=="" (
        If Exist "%~1\*" Call :_makeDir "%~1%zDT%"
        Call :_item "%~1" "%~1%zDT%" "%~1" "%cnt%" "%~1%zDT%" "%~dpn1%zDT%%~x1"
        If Exist "%~1\*" For /R "%~1%zDT%" %%f In (.) Do Set /A cf+=1
) Else (
        Call :_makeDir "%~dp1%zDT%"
        For %%i In (%*) Do Call :_item "%%~i" "%~dp1%zDT%\%%~nxi" "%~dp1%%~nxi" "%cntI%" "%~dp1%zDT%" "%~dp1%zDT%\%%~nxi"
        For /R "%~dp1%zDT%" %%f In (.) Do Set /A cf+=1
)
Echo Complete!
Echo Folders=%cf%        Files=%c%
Echo.
Pause
Exit


:_item
If Exist "%~1\*" (
        xCopy /T /E /H /K "%~1" "%~2\"|| GoTo :_err
        PushD "%~3"
        For /F "tokens=%~4* delims=\" %%a In ('Dir /S /B /A:-D') Do (
                If "%%~b"=="" (CD.>"%~5\%%~a") Else CD.>"%~5\%%~a\%%~b"
                Set /A c+=1
        )
        PopD
) Else (
        CD.>"%~6"
        Set /A c+=1
)
GoTo :EOF

:_err

For /R "%~2" %%f In (.) Do Set erf=%%f
Set erf=%erf:~0,-2%
Call Set erf=%%erf:%~2=%~1%%
RD /S /Q "%~5"
Echo Error xCopy on file:
Echo %erf%
Pause>Nul
Exit


:_makeDir
If Exist "%~1" RD /S /Q "%~1"
MD "%~1"
GoTo :EOF

После создания нуль-копии ее можно сравнить с оригиналом, на предмет отсутствия ошибок в структуре, заархивировать, и архив прикреплять к сообщению при написании ТЗ.

Рад буду услышать любую конструктивную критику и предложения по оптимизации скрипта.

IntuitOS 28-03-2013 12:28 2120607

Почему-то не получается. Где должна создаться эта нуль-папка?
мой скрипт с изменнёным путём к папке
PHP код:

@Echo Off
ChCp 1251
>Nul
If "%~1"=="" (
    Echo 
The correct syntax:
    Echo %~
nx0 "e:\Проекты\Сжатие\DV"
    
Pause>Nul
    
Exit
)
For /
"Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set t=%%i
Set zDT
=_Zero_%t:~2,2%%t:~4,2%%t:~6,2%_%t:~8,2%-%t:~10,2%
Set f=%~1Set cnt=2Set c=0Set cf=0
:_loop
    
If "%f:~0,1%"=="\" Set /A cnt+=1
    Set f=%f:~1%
If Defined f GoTo _loop
Set /A cntI=cnt-1

If "
%~2"=="" (
    If Exist "
%~1*" Call :_makeDir "%~1%zDT%"
    Call :_item "
%~1" "%~1%zDT%" "%~1" "%cnt%" "%~1%zDT%" "%~dpn1%zDT%%~x1"
    If Exist "
%~1*" For /R "%~1%zDT%" %%f In (.) Do Set /A cf+=1
) Else (
    Call :_makeDir "
%~dp1%zDT%"
    For %%i In (%*) Do Call :_item "
%%~i" "%~dp1%zDT%%%~nxi" "%~dp1%%~nxi" "%cntI%" "%~dp1%zDT%" "%~dp1%zDT%%%~nxi"
    For /R "
%~dp1%zDT%" %%f In (.) Do Set /A cf+=1
)
Echo Complete!
Echo Folders=%cf%    Files=%c%
Echo.
Pause
Exit

:_item
If Exist "
%~1*" (
    xCopy /T /E /H /K "
%~1" "%~2"|| GoTo :_err
    PushD "
%~3"
    For /F "
tokens=%~4delims=" %%a In ('Dir /S /B /A:-D') Do (
        If "
%%~b"=="" (CD.>"%~5%%~a") Else CD.>"%~5%%~a%%~b"
        Set /A c+=1
    )
    PopD
) Else (
    CD.>"
%~6"
    Set /A c+=1
)
GoTo :EOF

:_err
For /R "
%~2" %%f In (.) Do Set erf=%%f
Set erf=%erf:~0,-2%
Call Set erf=%%erf:%~2=%~1%%
RD /S /Q "
%~5"
Echo Error xCopy on file:
Echo %erf%
Pause>Nul
Exit

:_makeDir
If Exist "
%~1" RD /S /Q "%~1"
MD "
%~1"
GoTo :EOF 


gora 28-03-2013 12:37 2120611

Цитата:

Цитата IntuitOS
Где должна создаться эта нуль-папка?
мой скрипт с изменнёным путём к папке »

Нуль-копия папки создается рядом с исходной с добавление к имени суффикса _Zero_yyMMdd_HH-mm
Править скрипт не надо. Нужно его запустить с параметром в качестве которого нужно указать полный путь к папке, которую нужно обработать, заключенного в кавычки.
Пример:
Код:

ZeroCopy.bat "E:\Temp\путь к Вашей папке"

Vadikan 29-03-2013 09:11 2121278

gora, надо, чтобы люди клали скрипт в папку - это избавит от вопросов^^

gora 29-03-2013 09:16 2121280

Цитата:

Цитата Vadikan
клали скрипт в папку »

Скрипт может делать нуль-копию не одной папки, а сразу нескольких расположенных по разным путям. Кроме папок ему можно передать пути к файлам или комбинации путей папок\файлов.

А для совсем простого использования этого функционала у меня есть такая же опция в SetTools. Там просто выделяются нужные объекты и нажимается пункт в контекстном меню.

Vadikan 29-03-2013 12:52 2121411

gora, ок, тогда в шапке понятно объясните это тем, кто будет послан сюда :)

40rus 05-12-2013 19:54 2267593

А если имена файлов в обрабатываемой папке на китайском языке, как тогда быть?


Время: 11:33.

Время: 11:33.
© OSzone.net 2001-