Копирование нескольких файлов и добавление даты к имени bat

Я должен сделать файл .bat, который делает это:

Копирует из O:\siir во все файлы, имя которых начинается с "ls". В C:\sirto. И имя вывода будет таким же, как в источнике. Но это добавит текущую дату в конец имени файла.

Я попробовал следовать только для проверки, и это, конечно, не сработало: D. Но это, вероятно, лучше объясняет, что я пытаюсь сделать, чем объяснение выше.

echo off
xcopy O:\siirto\ls* C:\siirto\ls%date.txt
pause

Конечно он не работает. Но возможно ли это сделать с одним файлом .bat. Или мне нужно сделать все ls.txt-файлы своими собственными .bat-файлами или строками.

Как один для LS1.txt, LS2.txt LS3.txt

echo off
xcopy O:\siirto\LS1.txt C:\siirto\ls1%date
pause

Я понятия не имею, как %date должен добавляться в код, и нужно ли что-то еще для кода?

Я все еще на детской обуви в программировании...

Спасибо


person Lazu    schedule 25.06.2015    source источник
comment
имена переменных имеют % впереди И в конце: это %date%. Но он может содержать недопустимые символы для имен файлов - см. ответ JosefZ.   -  person Stephan    schedule 25.06.2015


Ответы (4)


вам нужно объединить итерацию по файлам с командой FOR и переменной среды %DATE%. Прочтите HELP FOR, обращая внимание на синтаксис расширения %~, и попробуйте следующий код.

for %%a in (o:\siirto\ls*) do (
   echo copy "%%a" "c:\siirto\%%~na-%date%%%~xa"
)

после тщательного тестирования удалите команду echo.


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

set src=o:\siirto\ls*
set dest=c:\siirto
for %%a in (%src%) do (
  copy "%%a" "%dest%\%%~na-%date%%%~xa"
)

и, если команда %date% возвращает недопустимые символы, прочитайте мой принятый ответ на этот вопрос SO Загрузите дату скрипта в переменную, а затем измените переменную на ту, которая содержит текущую дату в соответствующем формате.

person PA.    schedule 25.06.2015
comment
Это было первое, что я тестировал. Так сработало... :D спасибо за все ответы - person Lazu; 25.06.2015

%date% может содержать символы, которые не допускается в именах файлов. Попробуйте следующий независимый от локали подход:

@ECHO OFF
SETLOCAL enableextensions

for /F %%g in ('
  wmic OS get LocalDateTime /value^|findstr "="
  ') do for /F %%G in ("%%g") do set "_%%G"

set "_LocalDateTime=%_LocalDateTime:~0,8%"

for /F "delims=" %%G in ('
  dir /b O:\siirto\ls*.txt
  ') do echo copy /B "O:\siirto\%%G" "C:\siirto\%%~nG_%_LocalDateTime%%%~xG"

Ресурсы (обязательно к прочтению):

person JosefZ    schedule 25.06.2015

Переменная %date% по умолчанию содержит текущую дату, но формат даты зависит от пользовательских настроек, поэтому она может содержать разделители, такие как /-., может иметь имя дня и разделитель пробела, а также может иметь номер дня и номер месяца с подавленный ведущий ноль.

На SO есть много статей о форматировании строк даты в удобном для использования формате - рекомендуется формат ггггммдд, поскольку этот формат автоматически по имени в хронологической последовательности.

Обратите внимание, что не рекомендуется использовать переменную date, поскольку эта дата устанавливается и поддерживается системой, а любые пользовательские настройки переопределяют предполагаемые системные настройки. Используйте практически любое другое допустимое имя переменной (тот же комментарий относится к random и time среди прочих).

Итак, предположим, что вы назначаете дату в нужном формате переменной today, тогда

for %%a in (o:\siirto\ls*.txt) do (
   echo(copy "%%a" "c:\siirto\%%~na%today%%%~xa"
)

выполнит требуемую копию. %%~na означает часть имени файла в %%a и %%~xa часть расширения. Доступ к переменным обычно должен осуществляться с использованием %varname%. Имена файлов имеют "enclosed in quotes", чтобы гарантировать, что разделители в именах файлов (например, Пробел) рассматриваются как обычные символы, не имеющие специального значения разделителя.

Требуемые команды COPY просто ECHOed для целей тестирования. Убедившись в правильности команд, измените ECHO(COPY на COPY, чтобы действительно скопировать файлы. Добавьте >nul, чтобы скрыть отчетные сообщения (например, 1 file copied)

person Magoo    schedule 25.06.2015

Вы можете сделать все это в одной строке, используя forfiles1.

    forfiles /P O:\siirto /M ls*.txt /C "cmd /c copy @path C:\siirto\@fname-%date:~6,4%-%date:~3,2%-%date:~0,2%.txt"

Здесь forfiles просматривает все файлы по указанному пути /P, которые соответствуют маске /M, затем запускает команду для каждого найденного файла @path, чтобы скопировать его в новое место с добавленной датой. @fname здесь просто дает вам имя файла без пути или расширения.

Переменная %date% обычно дает что-то вроде 25.06.2015 или даже четверг 25.06.2015, в зависимости от ваших настроек. Вот почему вам нужно указать его части.

%date:~6,4% выбирает от седьмой до 11-й цифры даты (отсчет начинается с 0), что дает год. %date:~3,2% дает вам месяц (или день, в зависимости от того, из какой точки мира вы находитесь), а %date:~0,1% дает вам день (или месяц, опять же в зависимости от того, где вы находитесь).

Возможно, вам придется немного поиграть с этим, чтобы получить желаемый результат.

person Elly G    schedule 25.06.2015