Войти

Показать полную графическую версию : Нуль-копия папки для выкладывания на форуме.


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

Предлагаю вариант скрипта для создания такой нуль-копии папки:
@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
Почему-то не получается. Где должна создаться эта нуль-папка?
@Echo Off
ChCp 1251>Nul
If "%~1"=="" (
Echo The correct syntax:
Echo %~nx0 "e:\Проекты\Сжатие\DV"
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

gora
28-03-2013, 12:37
Где должна создаться эта нуль-папка?
мой скрипт с изменнёным путём к папке »
Нуль-копия папки создается рядом с исходной с добавление к имени суффикса _Zero_yyMMdd_HH-mm
Править скрипт не надо. Нужно его запустить с параметром в качестве которого нужно указать полный путь к папке, которую нужно обработать, заключенного в кавычки.
Пример:
ZeroCopy.bat "E:\Temp\путь к Вашей папке"

Vadikan
29-03-2013, 09:11
gora, надо, чтобы люди клали скрипт в папку - это избавит от вопросов^^

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

А для совсем простого использования этого функционала у меня есть такая же опция в SetTools (http://forum.oszone.net/thread-172130.html). Там просто выделяются нужные объекты и нажимается пункт в контекстном меню.

Vadikan
29-03-2013, 12:52
gora, ок, тогда в шапке понятно объясните это тем, кто будет послан сюда :)

40rus
05-12-2013, 19:54
А если имена файлов в обрабатываемой папке на китайском языке, как тогда быть?




© OSzone.net 2001-2012