2016-04-13 4 views
1

У меня есть некоторые из лог-файлов, отформатированных как этот "name.log"копировать и переименовывать файлы в другую папку

Я хотел бы, чтобы скопировать те из одной папки в другую папку, как

xcopy /y "C:\Folder1" "D:\Folder2" 

И мне нужно переименовать файл с созданной датой исходного файла (без файла копирования), чтобы текстовый файл в Folder2 был как "name yyyymmddhhmm.log", если какой-либо файл имеет то же имя (дата создания), он будет перезаписан.

Код:

set Source=C:\Users\user1\Desktop\Folder1 
set Dest=D:\Folder2 
if not exist %Dest% md %Dest% 
for /F %%a in ('dir /b "%Source%\*.txt"') do call :Sub %%a 
goto :eof 

:Sub 
set "filename=%1" 
for /F %%s in ("%Source%\%1") do if %%~zs==0 goto :eof 
set "datepart=" 
FOR /F "tokens=1-5 delims=/-: " %%a IN ('dir /tc "%filename%" ^| findstr "%filename%"') DO (
    IF "%%c" neq "" SET "datepart=%%c%%a%%b%%d%%e" 
) 
FOR /F %%a IN ("%filename%") DO (
    set "NewName=%%~na %datepart%%%~xa" 
) 
xcopy /y "%Source%\%filename%" "%Dest%\%NewName%*" 
GOTO :EOF 

Проблема заключается в том, что если я не поставил .bat в той же папке, что начальные файлы (Folder1), файлы не меняют имя. Например, если он отсутствует, файлы меняют имя со старым именем и одним пробелом.

Окна команд говорят мне, что он не находит файл, когда он получает дату создания.

Если я помещаю скрипт в папку1, он работает хорошо.

С другой стороны, если я выполняю сценарий с помощью «Планировщика заданий», у меня такая же проблема. Файлы копируются, но без даты создания.

Что мне нужно для решения этой проблемы?

+0

Возможно, это связано с разрешениями. Убедитесь, что папка доступна для записи пользователем. – Phiter

+0

Здравствуйте, я только что тестировал в двух папках на моем рабочем столе, и операция такая же, спасибо – Eduard

+0

Новое имя 'name yyyymmddhhmm.log' (в соответствии с вашим кодом), а не' yyyymmddhhmm.log' (согласно описание), поэтому, пожалуйста, уточните; в любом случае проблема вызвана командой 'dir/tc%% filename%" ', которая должна быть изменена на' dir/tc '% Source% \% filename% "'; кроме того, командную строку 'findstr' следует изменить на' findstr/L/E/C: "% filename%" 'до (по крайней мере почти) совпадения со всем именем файла; наконец, часть 'FOR/F %% a' должна быть изменена на' FOR "eol = | delims =" %% a' ... – aschipfl

ответ

0
@ECHO OFF 
SETLOCAL 

set Source=C:\Users\user1\Desktop\Folder1 
set Dest=D:\Folder2 

set "Source=u:\sourcedir\t w o" 
set "Dest=u:\destdir" 

if not exist "%Dest%" md "%Dest%" 

for /F "delims=" %%k in ('dir /b "%Source%\*.log"') do call :Sub "%%k" 
goto :eof 

:Sub 
SET "newname=%~1" 

for /F "delims=" %%s in ("%Source%\%~1") do (if %%~zs==0 goto :eof 

FOR /F "tokens=1-5 delims=/-: " %%a IN ('dir /tc "%Source%\%~1" ^| findstr "%~1"') DO (
    IF "%%c" neq "" SET "newname=%%~ns %%c%%a%%b%%d%%e%%~xs" 
) 
) 
ECHO(xcopy /y "%Source%\%~1" "%Dest%\%NewName%" 
GOTO :EOF 

Необходимые команды XCOPY являются лишь ECHO-е изд для целей тестирования. После того, как вы подтвердили правильность команд, измените ECHO(XCOPY на XCOPY, чтобы фактически скопировать файлы. Добавить >nul для подавления сообщений отчета (например, 1 file copied)

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

Первая проблема заключается в том, что я переопределил настройки вашего каталога с помощью каталогов в соответствии с моей системой. Синтаксис SET "var=value" (где значение может быть пустым) используется для обеспечения того, чтобы любые отклоняющиеся пробелы НЕ включались в назначенное значение. set /a можно безопасно использовать «quoteless».

Использование цитат в команде md делает процедуру невосприимчивой к "paths containing separators". Я проверяю использование пробелов в путях и именах файлов, потому что это, по-видимому, очень популярно.

Я изменил метаданные каталога с помощью %%a на %%k, чтобы избежать путаницы с %%a в подпрограмме. В вашем тексте говорится, что вы начинаете с файлов &.log, но ваша файловая маска была *.txt, поэтому я изменил ее на *.log. Цитирование параметра, переданного в :Sub, означает, что процедура получит полное имя файла, если оно содержит пробелы.

Внутри подпрограммы должно появиться, что yowant не изменит имя, если часть %%c из сканирования dir/tc пуста. %~1 - это предоставленное имя файла за вычетом кавычек.

Внешний контур в %%s: Я добавил delims= для удовлетворения пробелов в именах файлов и использовать %~1 в предпочтении к %filename%

В %%s блоке, %%s относится к файлу, так что вы можете использовать %%s и его модифицированные формы как %%~zs ссылаться на характеристики этого файла - которые, к сожалению, не включают в себя создание, дата (%%~ts содержит дату последнего обновления - вы можете быть в состоянии использовать это в тэ следующие строки, а не dir и findstr)

Затем, как предложено @aschipfi, укажите исходный каталог в dir, иначе dir имеет место в каталоге .

FOR /F "tokens=1-5 delims=/-: " %%a IN ("%%~ts") DO (

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

Так что - если %%c не пусто, то установите новое имя (название части файла в %%s) + пробел + дата строки + (расширение в %%s)

А затем сделать xcopy - используя старое имя, если оно не было изменено.

+0

Извините, я проверил файлы .txt, и я не забыл его изменить. Большое спасибо за ваше объяснение так ясно. У меня есть одно сомнение, почему вы используете «t w o» в строке «surscedir \ t w o»? – Eduard

+0

Чтобы проверить, что он работает с именем каталога, который содержит пробелы, я помещал тестовые файлы в этот каталог (он находится в RAMdrive, поэтому он аккуратно удаляется при отключении питания) - как тестовые файлы, так и имя каталога содержат пробелы, поэтому если он работает, он также будет работать для файла/directoryname, не содержащего пробелов (в пределах разумного - если вы хотите использовать неудобные символы, которым 'cmd' присваивает специальное значение, например' & ', - тогда вы можете решить возникающие проблемы.) – Magoo

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