Тема: CMD/BAT: Копирование файла в неизвестную папку
Как можно скопировать файл 1.txt в директорию C:\test в которой есть много папок с неизвестным именем, файл должен копироваться во все эти папки и если такой файл существует заменить.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как можно скопировать файл 1.txt в директорию C:\test в которой есть много папок с неизвестным именем, файл должен копироваться во все эти папки и если такой файл существует заменить.
Например, так:
@echo off
setlocal
set sFolder=c:\test
for /f "usebackq" %%i in (`dir /b /o:n /a:d "%sFolder%"`) do copy /y "1.txt" "%sFolder%\%%i\">nul
endlocal
exit /b 0
Добрый день!
Может сможете помочь. Ситуация похожая. Но с одним "но" , внутри папки test помимо папок с неизвестным именем, в каждой из них есть подпапки порядка 5-6 шт.
Как организовать все так , что бы файлик 1.txt помещался во все эти назовем их "дальние папки"
Приложил картинку как я это вижу ... художник из меня так себе
Вместо Фамилий так же папки с неизвестным именем.
@echo off
setlocal
set "sFolder=C:\test"
for /f "delims=" %%i in ('"2>nul dir /ad/b "%sFolder%""') do (
for /f "delims=" %%j in ('"2>nul dir /ad/b "%sFolder%\%%i""') do (
>nul copy /y "1.txt" "%sFolder%\%%i\%%j"
)
)
endlocal
exit /b 0
Огромное Спасибо.
А вот ещё работающий вариант, без dir и вложенных циклов:
@Echo OFF
SetLocal
Set "FOLDER=D:\Test" & rem целевая папка
Set "FILE=%~dp0\1.txt" & rem предполагаем, что копируемый файл в той же папке, что и сам .CMD
rem imho, конструкция For /R тут вполне в тему
rem
Pushd "%FOLDER%"
For /R %%d In (.) Do Copy /y "%FILE%" "%%d\*"
Popd
EndLocal
Exit /B
rem imho, конструкция For /R тут вполне в тему
1. Да ну? А Вы не заметили, что файл нужно копировать только в "дальние папки", а не во все?
Если уж использовать эту конструкцию для решения данной и других подобных задач, то предложу для обсуждения такой способ:
@echo off
setlocal
set "sFolder=C:\test"
set "sFile=%~dp01.txt"
:: Устанавливаем нужный уровень вложенности обрабатываемых каталогов.
set level=2
:: Получаем регулярное выражение для поиска папок данного уровня вложенности
:: и записываем его во временный файл (иначе у команды "findstr" проявится очередной баг).
set reg_expr=
for /l %%i in (1 1 %level%) do (
call set reg_expr=%%reg_expr%%[\\][\\]*\\
)
echo ^^\"%reg_expr:[\\]=[^\\]%\"$>"%~dp0.tmp"
pushd "%sFolder%"
for /r %%i in (.) do (
rem Убираем финальные точку и слеш, но слеш возвращаем.
set x=%%~fi\
rem Из полных имён каталогов убираем часть, являющуюся полным именем корневого каталога,
rem и следующий за ней слеш;
rem в выводе результата командой "echo" ищем каталоги с заданным уровнем вложенности и,
rem если находим, копируем в них файл.
for /f "delims=" %%j in ('
call echo "%%x:%cd%\=%%"^| findstr /g:"%~dp0.tmp"
') do (
>nul copy /y "%sFile%" %%j
)
)
popd
del "%~dp0.tmp"
endlocal
exit /b 0
.
2. Конструкция "for /f" во многих случаях предпочтительнее конструкций "for /r", "for /d", "for /d /r" и просто "for", так как первая оперируют фиксированным списком, созданным в начале работы такой конструкции, а вторые оперируют по очереди всеми подходящими элементами набора, зачастую созданными уже в результате работы этой самой конструкции. Много раз мне приходилось это объяснять в ответах на вопросы вроде такого: "Почему пакетный файл переименовывает файлы по второму кругу?"
Пример:
@for /l %%i in (1 1 100) do @type nul>"%%i.txt"
@for %%i in (*.txt) do @ren "%%i" "%%~ni_new.txt"
.
В результате увидите файл, переименованный дважды: "1_new_new.txt".
…так как первая оперируют фиксированным списком, созданным в начале работы такой конструкции, а вторые оперируют по очереди всеми подходящими элементами набора, зачастую созданными уже в результате работы этой самой конструкции. Много раз мне приходилось это объяснять в ответах на вопросы вроде такого: "Почему пакетный файл переименовывает файлы по второму кругу?"
Именно. Особым шиком тут является попадание под маску коротких имён файлов с кириллическими именами .
Ну раз тут такое пошло , еще один интересный вопрос , предположим что файлик называется не "1.txt" а "Важный файл.txt"
Ранее для того что бы .bat корректно работал приходилось подгружать код в Sublime Text 2.0.2 и преобразовывать (Windows 866).
Возможно ли совершить данные действия минуя данную прогу?
Никуда ничего «подгружать» и «преобразовывать» не надо. Достаточно просто использовать нормальный редактор с поддержкой кодировки OEM/866.
Никуда ничего «подгружать» и «преобразовывать» не надо. Достаточно просто использовать нормальный редактор с поддержкой кодировки OEM/866.
или:
@echo off
setlocal
>nul chcp 1251
set "sFolder=C:\test"
set "sFile=%~dp0Важный файл.txt"
for /f "delims=" %%i in ('"2>nul dir /ad/b "%sFolder%""') do (
for /f "delims=" %%j in ('"2>nul dir /ad/b "%sFolder%\%%i""') do (
>nul copy /y "%sFile%" "%sFolder%\%%i\%%j"
)
)
endlocal
exit /b 0
.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться