1

Тема: CMD/BAT: Копирование файла в неизвестную папку

Как можно скопировать файл 1.txt в директорию C:\test в которой есть много папок с неизвестным именем, файл должен копироваться во все эти папки и если такой файл существует заменить.

2

Re: CMD/BAT: Копирование файла в неизвестную папку

Например, так:

@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

3 (изменено: PavelR, 2014-11-25 12:00:10)

Re: CMD/BAT: Копирование файла в неизвестную папку

Добрый день!
Может сможете помочь. Ситуация похожая. Но с одним "но" , внутри папки test помимо  папок с неизвестным именем,  в каждой из них есть подпапки порядка 5-6 шт.
Как организовать все так , что бы файлик 1.txt помещался во все эти назовем их "дальние папки"

Приложил картинку как я это вижу ... художник из меня так себе  
http://i.imgur.com/P69PVPO.png

Вместо Фамилий так же папки с неизвестным именем.

4

Re: CMD/BAT: Копирование файла в неизвестную папку

@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

5

Re: CMD/BAT: Копирование файла в неизвестную папку

Огромное Спасибо.

6

Re: CMD/BAT: Копирование файла в неизвестную папку

А вот ещё работающий вариант, без 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

7

Re: CMD/BAT: Копирование файла в неизвестную папку

Alecsis пишет:
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".

8

Re: CMD/BAT: Копирование файла в неизвестную папку

Yury пишет:

…так как первая оперируют фиксированным списком, созданным в начале работы такой конструкции, а вторые оперируют по очереди всеми подходящими элементами набора, зачастую созданными уже в результате работы этой самой конструкции. Много раз мне приходилось это объяснять в ответах на вопросы вроде такого: "Почему пакетный файл переименовывает файлы по второму кругу?"

Именно. Особым шиком тут является попадание под маску коротких имён файлов с кириллическими именами .

9

Re: CMD/BAT: Копирование файла в неизвестную папку

Ну раз тут такое пошло , еще один интересный вопрос , предположим что файлик называется не "1.txt"   а  "Важный файл.txt"
Ранее для того что бы .bat корректно работал приходилось подгружать код в Sublime Text 2.0.2 и преобразовывать (Windows 866).
Возможно ли совершить данные действия минуя данную прогу?

10

Re: CMD/BAT: Копирование файла в неизвестную папку

Никуда ничего «подгружать» и «преобразовывать» не надо. Достаточно просто использовать нормальный редактор с поддержкой кодировки OEM/866.

11

Re: CMD/BAT: Копирование файла в неизвестную папку

alexii пишет:

Никуда ничего «подгружать» и «преобразовывать» не надо. Достаточно просто использовать нормальный редактор с поддержкой кодировки 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

.