1 (изменено: ruslan, 2016-08-29 18:15:11)

Тема: CMD/BAT: Переместить созданный последним файл с новым именем

Помогите плз. несложный скрипт составить.

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

Заранее спасибо.

2

Re: CMD/BAT: Переместить созданный последним файл с новым именем

for /f %%# in ('dir *.txt /b/o-D') do move /y "%%#" "C:\Куда перемещать\новое имя.txt" &exit/b

3 (изменено: ruslan, 2016-08-30 16:46:58)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Спасибо !
Но еще вопрос - как мне в качестве текущей папки указать сетевую (cd пишет не поддерживает) ?
Или как то иначе явно указать папку источник ?

Хотя на локальных ресурсах тоже не получается ...
Пробую так :


D:
CD "D:\backup\uso\"
for /f %%# in ('dir *.bak /b/o D') do move /y "%%#" "D:\backup\uso\Test\uso_lgss.bak" &exit/b

Отвечает - непредвиденное появление %%#.

4

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
Батник сохранять в этой же папке пробовали?
Зачем сверху D: ?
CD не обязателен. Если сценарий сохранён в ином месте, то данный путь пишется перед маской *.bak.

5 (изменено: ruslan, 2016-08-30 17:07:55)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher
Если расположить батник в папке источнике, то да, отрабатывает, правда взял первый по времени создания, а не последний.

А если я хочу использовать скрипт как код CmdExec в Агенте SQL Сервера, как он изменится ?
Как измениться скрипт если использовать XCOPY , вместо MOVE ?

Заранее спасибо.

6

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
Поменял порядок в своём примере (из головы вылетело, что начинается со старого).
Не знаю, как там устроено в агенте. Но всегда можно попробовать использовать либо полные либо относительные (агента) пути.
Xcopy не умеет перемещать файлы, она только копирует.
Вот robocopy умеет, но делает это по принципу копирования и удаления, а не изменения пути в рамках одного тома.

7

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher пишет:

ruslan
Xcopy не умеет перемещать файлы, она только копирует.

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

8

Re: CMD/BAT: Переместить созданный последним файл с новым именем

for /f %%# in ('dir D:\backup\uso\*.bak /b/o-D') do xcopy /hrkxyz "%%#" "D:\backup\uso\Test\uso_lgss.bak" & goto:eof

А для CmdExec по идее и батник не нужен. Там команды достаточно:

cmd /c for /f %# in ('dir D:\backup\uso\*.bak /b/o-D') do xcopy /hrkxyz "%#" "D:\backup\uso\Test\uso_lgss.bak"&exit

9

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher пишет:
for /f %%# in ('dir D:\backup\uso\*.bak /b/o-D') do xcopy /hrkxyz "%%#" "D:\backup\uso\Test\uso_lgss.bak" & goto:eof

В какой-то бесконечный цикл входит. А затем по ошибке падает.

10

Re: CMD/BAT: Переместить созданный последним файл с новым именем

А так?:

@echo off
cd D:\backup\uso
for /f %%# in ('dir *.bak /a-D/b/o-D/tC') do (
   echo f|xcopy /hrkyz "%%#" D:\backup\uso\Test\uso_lgss.bak
   goto:eof
)

Вместо первой D: ещё можно UNC-имя прописать.

11 (изменено: ruslan, 2016-08-31 15:44:08)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Вот на такой код:

for /f %# in ('dir "D:\backup\uso\Test1\*.bak" /b/o-D') do 
xcopy /hrkxy "%#" "D:\backup\uso\Test\uso_lgss.bak"

отвечает -

C:\Windows\system32>xcopy /hrkxy "uso_lgss111.bak" "D:\backup\uso\Test\uso_lgss.bak"   Не найден файл: uso_lgss111.bak  Скопировано файлов: 0.    C:\Windows\system32>xcopy /hrkxy "uso_lgss222.bak" "D:\backup\uso\Test\uso_lgss.bak"   Не найден файл: uso_lgss222.bak  Скопировано файлов: 0.  Код завершения процесса 4.  Шаг завершился с ошибкой.

(файлы uso_lgss111.bak и uso_lgss222.bak лежат в папке исходнике).

Если код такой:

cd "D:\backup\uso\Test1"
for /f %# in ('dir "D:\backup\uso\Test1\*.bak" /b/o-D') do 
xcopy /hrkxy "%#" "D:\backup\uso\Test\uso_lgss.bak"

то ошибок нет, но ничего не происходит.

На следующий код :

@echo off
cd D:\backup\uso\Test1
for /f %%# in ('dir *.bak /a-D/b/o-D/tC') do (
   echo f|xcopy /hrkxyz "%%#" D:\backup\uso\Test\uso_lgss.bak
   goto:eof
)

отвечает -

Невозможно создать процесс для шага 3 задания 0x62A03265CCA42A458A8423DE302E2BBE (причина: Не удается найти указанный файл).  Шаг завершился с ошибкой.

12

Re: CMD/BAT: Переместить созданный последним файл с новым именем

XCOPY "D:\backup\uso\Test1\*.bak" "D:\backup\uso\Test\*.bak" /e /y /h /c

Работает без проблем, но он естественно копирует все что есть.

13

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
Разбираем мой последний пример. Остальные нет смысла.
D:\backup\uso\Test1 - это реально существующая сетевая папка, и в ней лежат bak-файлы, так?
Если это тестируемая локальная папка, то 'z' на конце ключей xcopy нужно убрать. Также я убрал ключ 'x' из связки с 'z'.
И заодно систему назвать не помешает.

14 (изменено: ruslan, 2016-08-31 17:44:30)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

D:\backup\uso\Test1  это реально существующая локальная папка (я для простоты тестирую пока на локальных).
Да, в ней лежат bak файлы.
Действительно, у меня были ошибки на связку параметра X c Z, пробовал убирать по отдельности и вместе.
Win Server 2012 R2.

15 (изменено: ruslan, 2016-08-31 17:43:53)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Без параметров X и Z ошибка уже другая:

Невозможно создать процесс для шага 5 задания 0x62A03265CCA42A458A8423DE302E2BBE (причина: Не удается найти указанный файл).  Шаг завершился с ошибкой.

16

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Что покажет запуск cmd /k This.bat ?:

@echo off
cd D:\backup\uso\Test1
for /f %%# in ('dir *.bak /a-D/b/o-D/tC') do echo "%%#"&exit /b

17

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher
Если запускаю скрипт в консоли cmd , то пишет

"непредвиденное появление %%#."

.
Если в Агенте SQL , то там ошибка :

Невозможно создать процесс для шага 6 задания 0x62A03265CCA42A458A8423DE302E2BBE (причина: Не удается найти указанный файл).  Шаг завершился с ошибкой.

18 (изменено: ruslan, 2016-08-31 17:43:23)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Может разделить операции, сначала копирование, потом переименование ?

19

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
2 заглавные буквы потерялись в постах. Исправляйтесь.

20

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher
Исправил.

21

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan пишет:

Если запускаю скрипт в консоли cmd

Как именно?

22

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher
Запускаю cmd /k через выполнить.
Затем копирую код скрипта и Enter.

23

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
Дык это неверно. Я же показал, что выполнять нужно сразу с именем батника (в данном случае с путём) с имеющимся кодом. Ничего копипастить в консоль не надо.

24

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher
Если я Агенту SQL Сервера кормлю "cmd /k D:\backup\uso\Test1\This.bat" вместо кода самого скрипта, надолго задумывается, пока не остановишь, ошибок не выдает.

25

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
Мы пока Run разбираем. К агенту позже вернёмся.

26 (изменено: ruslan, 2016-08-31 18:28:54)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher
На "cmd /k D:\backup\uso\Test1\This.bat" отвечает "файл не найден".

27

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
Такое может быть только в случае, если в папке D:\backup\uso\Test1\ нет bak-файлов.
А, у меня в коде txt стояло, исправил.

28 (изменено: ruslan, 2016-09-01 11:39:42)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher

@echo off
for /f %%# in ('dir D:\backup\uso\Test1\*.BAK /a-D/b/o-D/tC') do echo "%%#"&exit /b

Вот такой код отработал.
Написал : "uso_lgss222.bak" - это последний по времени создания файл.

29

Re: CMD/BAT: Переместить созданный последним файл с новым именем

@echo off
for /f %%# in ('dir D:\backup\uso\Test1\*.BAK /a-D/b/o-D/tC') do (
   echo xcopy /hrky "%%#" D:\backup\uso\Test\uso_lgss.bak
   goto:eof
)

Отвечает:

xcopy /hrky "uso_lgss222.bak" D:\backup\uso\Test\uso_lgss.bak

но ничего не копирует.

30 (изменено: ruslan, 2016-09-01 11:55:56)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Если добавить f| перед xcopy, то отвечает "не найден файл uso_lgss222.bak. Скопировано файлов 0."

31 (изменено: ruslan, 2016-09-01 12:29:22)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

@echo off
for /f %%# in ('dir D:\backup\uso\Test1\*.BAK /a-D/b/o-D/tC') do (
   echo f|xcopy /hrky "D:\backup\uso\Test1\%%#" D:\backup\uso\Test\uso_lgss.bak
   goto:eof
)

Вот этот код отработал правильно. Спасибо !
Единственно что, если скрипт запускать прямо из агента, то упорно пишет "Не удается найти указанный файл". Но теперь, как минимум, есть выход через батник.

32

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan
Если батник находится рядом с файлами, то он должен был отработать и без указания прямых путей.
С агентом я бы пробовал так: C:\Windows\System32\cmd.exe /с D:\backup\uso\Test1\This.bat

33

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher

cmd /c for /f %# in ('dir \\srv-hv-1c-sql1\Backup-USO\*.bak /b/o-D') do xcopy /hrkxy "\\srv-hv-1c-sql1\Backup-USO\%#" "D:\backup\uso\Test\uso_lgss.bak"&exit

Вот такой код в агенте сработал, но единственно он работает, если только в в конечном пути уже есть файл uso_lgss.bak. Видимо не отрабатывает подавление вопроса.
А если через bat файл, то отработал код:

D:\backup\uso\Test1\This.bat

34

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Flasher пишет:

ruslan
Если батник находится рядом с файлами, то он должен был отработать и без указания прямых путей.

Но почему то не отрабатывал.

35

Re: CMD/BAT: Переместить созданный последним файл с новым именем

for /f %# in ('dir \\srv-hv-1c-sql1\Backup-USO\1\*.bak /b/o-D') do xcopy /hrkxy "\\srv-hv-1c-sql1\Backup-USO\1\%#" "D:\backup\uso\Test\uso_lgss.bak"

Такой код в агенте тоже работает, но опять же если есть файл "uso_lgss.bak" .

36

Re: CMD/BAT: Переместить созданный последним файл с новым именем

ruslan пишет:

Видимо не отрабатывает подавление вопроса.

Так его и нету. echo f| - это и есть подавление (точнее подтверждение).

ruslan пишет:

А если через bat файл, то отработал код:

Вот и хорошо.

Настоятельно прошу не плодить посты, а дописывать в один (до ответа).

37 (изменено: ruslan, 2016-09-01 18:17:54)

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Изначально у меня задача была следующая (может кому пригодится) :
каждое утро иметь копию рабочей БД на другом сервере.

Получилось 3 шага в задании Агента SQL сервера.
1. Шаг (тип CmdExec) - копирую по маске последний полный бэкап на новый сервер:

for /f %# in ('dir "\\полный сетевой путь\маска*.bak" /a-D/b/o-D/tC') do echo f|xcopy /hrkzy "\\полный сетевой путь\%#" "D:\backup\backup.bak" &exit

2. Шаг (тип T-SQL)- устанавливаю монопольный доступ к базе:

use master;
alter database everyday_backup set single_user with rollback immediate;
use everyday_backup;

3. Шаг (тип T-SQL)- непосредственно разворачивание БД

RESTORE DATABASE everyday_backup
FROM  DISK='D:\backup\backup.bak'
WITH   RECOVERY ,  REPLACE ,
MOVE 'everyday_backup_' TO 'D:\sql-base\everyday_backup.mdf',
MOVE 'everyday_backup_1' TO 'D:\sql-base\everyday_backup.ndf',
MOVE 'everyday_backup_2' TO 'D:\sql-log\everyday_backup.LDF'

38

Re: CMD/BAT: Переместить созданный последним файл с новым именем

Я всё-таки такие ключи советую прописать: /a-D/b/o-D/tC. Это исключит папки с расширением bak и в сортировке учтёт дату создания (как запрашивалось).
И обязательно нужно в конце прописать &exit, а то все маска*.bak будут копироваться.