2016-05-16 3 views
-4

Я новичок в пакетном сценарии, мне нужна помощь в решении этой повторяющейся ручной задачи. Мне нужно автоматизировать, используя пакетный файлПакетный файл для переименования подпапки в соответствии с именем подпапки

У меня есть эти каталоги структуры, как показано ниже, например

c:\machines\models\a\defects 
c:\machines\models\b\defects 
c:\machines\models\c\defects 
c:\machines\models\d\defects 
and it continues e, f, g, h 

(а, Ь, с, d просто пример, как машины будут генерировать папки в зависимости от модели мы тестируем)

Я хотел бы, чтобы переместить дефекты содержимое папки (включая вложенные папки & файлы внутри него) к пункту назначения папки, которые имеют: папка 1. Текущая дата 2. Переименуйте дефекты в соответствии с ней моделей, как показано ниже желаемых результатов с помощью batc h файл (ms dos)

e:\backup\currentdate\a_defects 
e:\backup\currentdate\b_defects 
e:\backup\currentdate\c_defects 
e:\backup\currentdate\d_defects 

Пожалуйста, помогите!

+2

Добро пожаловать в SO. Пожалуйста, прочитайте [mcve]. Пожалуйста, введите здесь код. – sjsam

+0

Отмечено с благодарностью sjsam. Поместит некоторый код здесь, как только я буду хорош в пакетном коде :) –

+2

Вы не можете стать _good в пакетном кодировании_, не пытаясь (и ошибаться :)) – JosefZ

ответ

1

Вот прокомментировал пакетный код для выполнения этой задачи:

@echo off 
setlocal 

rem Define source and backup path. 
set "SourcePath=C:\machines\models" 
set "BackupPath=E:\backup" 

rem Get current date in format YYYY-MM-DD independent on local date format. 
for /F "skip=1 tokens=1 delims=." %%T in ('%SystemRoot%\System32\wbem\wmic.exe OS get localdatetime') do set LocalDateTime=%%T & goto ReformatDate 
:ReformatDate 
set "YearMonthDay=%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2% 

rem For each subfolder in source path check if there is a subfolder "defects". 
rem If subfolder "defects" exists, copy all files and subfolders of "defects" 
rem to the appropriate backup directory with current date and subfolder name 
rem in source folder path. Then remove the subfolder "defects" in source 
rem folder even if being completely empty to avoid processing this folder 
rem again when not being recreated again in the meantime. 

for /D %%# in ("%SourcePath%\*") do (
    if exist "%%#\defects\*" (
     %SystemRoot%\System32\xcopy.exe "%%#\defects\*" "%BackupPath%\%YearMonthDay%\%%~nx#_defects\" /H /I /K /Q /R /S /Y >nul 
     rd /Q /S "%%#\defects" 
    ) 
) 
endlocal 

Выполнить один раз в окне командной строки wmic OS get localdatetime, чтобы увидеть, что эта команда выводит, чтобы лучше понять, как текущая дата определяется в формате YYYY-MM-DD. Было бы быстрее использовать %DATE%, но формат строки даты %DATE% зависит от страны, заданной в регионе Windows и языковых настройках, и поэтому требует знания формата строки даты на компьютере, на котором запущен этот командный файл.

Команды XCOPY с используемыми вариантами не создает подкаталог в каталоге резервного копирования, если есть defects вложенные в директории models, но в целом defects подпапок дерева есть не по крайней мере, один файл для копирования.

Альтернативный код с использованием переменной окружения DATE с ожиданием, что расширенная строка даты заканчивается на: MM/DD/YYYY, например. Tue 05/17/2016, подробно разъяснено в ответ на:
What does %date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2% mean?

@echo off 
setlocal 

rem Define source and backup path. 
set "SourcePath=C:\machines\models" 
set "BackupPath=E:\backup" 

rem Get current date in format YYYY-MM-DD depending on local date format. 
set "YearMonthDay=%DATE:~-4,4%-%DATE:~-10,2%-%DATE:~-7,2%" 

rem For each subfolder in source path check if there is a subfolder "defects". 
rem If subfolder "defects" exists, copy all files and subfolders of "defects" 
rem to the appropriate backup directory with current date and subfolder name 
rem in source folder path. Then remove the subfolder "defects" in source 
rem folder even if being completely empty to avoid processing this folder 
rem again when not being recreated again in the meantime. 

for /D %%# in ("%SourcePath%\*") do (
    if exist "%%#\defects\*" (
     %SystemRoot%\System32\xcopy.exe "%%#\defects\*" "%BackupPath%\%YearMonthDay%\%%~nx#_defects\" /H /I /K /Q /R /S /Y >nul 
     rd /Q /S "%%#\defects" 
    ) 
) 
endlocal 

Для понимания используемых команд и как они работают, откройте окно командной строки, выполните там следующие команды, и читать полностью все справочные страницы отображаются для каждого очень осторожно.

  • echo /?
  • endlocal /?
  • for /? ... объясняет также %%~nx# (имя (и расширение) моделей вложенной).
  • if /?
  • rd /?
  • set /?
  • setlocal /?
  • wmic.exe OS get /?
  • xcopy /?

Смотрите также статью Microsoft о Using command redirection operators, чтобы понять смысл >nul.

Почему %%~nx# и не только %%~n# как папка не имеет расширение файла?

Командный процессор Windows не определяет, является ли строка папкой или именем файла. Все после последнего обратного слэша интерпретируется как имя файла независимо от того, что он в действительности является именем файла или папки. И все после последней точки после последней обратной косой черты в строке интерпретируется как расширение файла, даже если это означает, что имя папки или файла, на которое ссылаются %~n, является пустой строкой, потому что имя папки/файла начинается с точки и не содержит еще одного как многие «скрытые» файлы на системах * nix, например, .htaccess. Поэтому %~nx должен всегда использоваться, если в командной строке требуется цельное имя папки или файла.

+0

Ok выход для echo% DATE% is Tue 05/17 /. Есть ли лучший способ использования даты в качестве каталога. Я предпочитаю использовать дату, я буду искать и читать ссылки, которые вы дали. Спасибо :) –

+0

Добавлен альтернативный пакетный код с текущей датой в формате 'YYYY-MM-DD' для имени каталога, определенного из переменной среды __DATE__ в формате' сокращенный день недели MM/DD/YYYY', например. 'Tue 05/17/2016'. – Mofi

0

мой прокомментированный код. Mofi работает быстрее (No Site for Old Men ...)

Использование robocopy command, а не deprecated xcopy.

Примечание /L переключатель в robocopy команды: Список только - не копировать, метка времени или удалить любые файлы. Удалите /L переключатель не раньше, чем отлаживается.

@ECHO OFF 
SETLOCAL EnableExtensions 
rem obtain %_currentdate% variable in locale independent yyyymmdd format 
for /f "tokens=2 delims==" %%G in (
    'wmic OS get localdatetime /value^|find "="') do set "_currentdate=%%G" 
set "_currentdate=%_currentdate:~0,8%" 
rem show %_currentdate% variable for debugging purposes 
set _currentdate 

rem appoint source and target directories 
set "_sourcedir=c:\machines\models" 
set "_targetdir=E:\backup\%_currentdate%" 

for /F "delims=" %%G in ('dir /B /AD "%_sourcedir%\"') do (
    set "_notEmpty=" 
    rem check if `defects` folder exists 
    if exist "%_sourcedir%\%%G\defects\*" (
    rem credit and tribute to DBenham in https://stackoverflow.com/a/10818854/3439404 
    rem check if a folder contains at least one file 
    >nul 2>nul dir /a-d "%_sourcedir%\%%G\defects\*" && (set "_notEmpty=f") 
    rem check if a folder or any of its descendents contain at least one file 
    >nul 2>nul dir /a-d /s "%_sourcedir%\%%G\defects\*" && (set "_notEmpty=f") 

    if defined _notEmpty (
     rem create target directory silently; suppress error message 'already exists' 
     md "%_targetdir%\%%G_defects\" >NUL 2>&1 

     rem move content of %_sourcedir%\%%G\defects\* to %_targetdir%\%%G_defects\ 
     robocopy "%_sourcedir%\%%G\defects" "%_targetdir%\%%G_defects" /S /E /MOVE /L 

     rem recreate source directory deleted (moved) by robocopy 
     md "%_sourcedir%\%%G\defects\" >NUL 2>&1 
    ) else (
     echo nothing to do in %_sourcedir%\%%G\defects 
    ) 
) else (
     echo nothing to do in %_sourcedir%\%%G 
) 
) 

Кредит и дань DBenham в this answer (проверьте, если папка или не пуста).

+0

Привет @josefZ, к сожалению, машина (XP) не поддерживает robocopy, я ценю вашу помощь. Изучит ваш код, поскольку он может помочь в будущем пакетном коде. Оценил вашу помощь :) –

Смежные вопросы