Здравствуйте, Гость ( Вход | Регистрация )

Правила | Поиск | Помощь | Участники | Репутация


Страницы: (4) 1 2 [3] 4    (К непрочитанным сообщениям) ОтветитьНовая темаНовый опрос
faq: консольные команды ос windows, консольные команды windows, к-рые помогут выполнить нек-рые задачи быстрее или их автоматизировать.
« Предыдущая тема | Следующая тема » Версия для печати
apostle
24 Dec 2008, 19:14  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

Цитата:
Фраза "передаем эту строку в переменную" говорит мне только о том, что нужно задать переменную

опять же, сейчас не скажу, как передать рез-т выполнения команды в переменную (решение было, но сейчас я его не помню). примитивный способ — вывести рез-т выполнения в файл и потом прочитать из него уже в переменную с помощью for /f %i on (file_path)
другой вариант основан на опять же на for — FOR /F ["options"] %variable IN ('command') DO command [command-parameters]. основная порблема в том, что for не так, как ожидается отрабатывает (вернее, как хотелось бы) операторы перенаправления вводы в скобках. для этого можно использовать call:
Код:
for /f %%i in ('dir /A:-D /O:D /T:W /b') do call :trunc %i

trunc

echo %1

break
(или что-нибудь типа того (exit && exit) — в данном случае мы ушли от необходимости выделять и обрезать 1 строку вывода, т.к. 1ым же вызовом call мы передаем искомый рез-т. после этого там нужно выполнить необходимые действия и форсированно выйти и з командного файла, чтобы не произвести те же действия над остальными файлами.

Это сообщение отредактировал(а) apostle — 24 Dec 2008, 19:26
 
 
ядовитый лис
25 Dec 2008, 09:10  


Сейчас вне форума
Группа: Свой человек
Сообщений: 357
Репутация: 1
Регистрация: 20 Sep 05
Живет: SPb

Процесс пошел…пока мой батник удаляет все, что есть в папке, включая себя :)

Добавлено:
Сделал скрипт, который нормально вычисляет и удаляет самый старый файл :)
Потихоньку движется дело. Выложу попозже код, уже вижу, что там много лишнего убрать можно, но как — не знаю.

Это сообщение отредактировал(а) ядовитый лис — 26 Dec 2008, 06:41
 
 
apostle
25 Dec 2008, 18:01  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

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

Это сообщение отредактировал(а) apostle — 25 Dec 2008, 18:01
 
 
ядовитый лис
29 Dec 2008, 08:57  


Сейчас вне форума
Группа: Свой человек
Сообщений: 357
Репутация: 1
Регистрация: 20 Sep 05
Живет: SPb

Код:
@echo off
echo.
echo.
echo ###################################################################
echo cleanup_tt.bat
echo -------------------------------------------------------------------
echo                        Удаление старых бэкапов!!!
echo.              
echo     ###   %DATE%  ###   %TIME%   ###  
echo.
echo -------------------------------------------------------------------
echo.
echo "Проверка наличия актуального бэкапа……"
echo.







FOR /F "tokens=2 delims= " %%A in ('date /t') do set DATE=%%A

E:

cd   \folder\
     dir /b /o-d tt*
if     %ERRORLEVEL% NEQ 0 (
      echo Бэкапов нет вообще!!!
      echo.
    GOTO END1
   )

FOR /F %%A in ('dir /b /o-d tt*')  do  set OLD=%%A

echo.

if   EXIST tt_%DATE%.txt (
      echo "Актуальный бэкап найден!       ### tt_%DATE%.txt ###"
      echo.      
      echo "Старый бэкап будет удален! ### %OLD% ###"
      echo.
      DEL /Q %OLD%
   )
echo.

if NOT EXIST  %OLD% (
      echo -------------------------------------------------------------------
      echo "Старый бэкап успешно удален!!!"
      echo -------------------------------------------------------------------
      GOTO END2
   ) else (
      GOTO END1
   )


echo.

                         




:END1
echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
echo "^^^^^^^^  Удаление не прошло !!!  Конец !!!  ^^^^^^^^"
echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
echo.
echo ###################################################################

:END2
echo ###################################################################


для тестов использую файлы вида tt_dd.mm.yyyy.txt
Скрипт работает и уже запущен на паре серваков. Что хотелось бы мне от него дальше:
1)Он должен скидывать в лог конкретную ошибку. Ошибки могут быть следующие:
а. нет актуального бэкапа
б. актуальный бэкап есть, но удалить старый не получается.
в. бэкапов нет вообще.

Я пытался так сделать, но у меня все было построено на операторе IF, там получилась мешанина и скрипт писал в лог все три ошибки.
Это происходило, потому что я не знаю, как остановить дальнейшее выполнение батника, если произошла одна из ошибок. Можно банально вписать в
else (
echo Comment
exit)


но тогда тестить очень неудобно, окно закрывается постоянно. <_<
Еще такая проблемка выявилась: для проверки пункта 1.б я закрыл доступ к старому бэкапу, соответственно, когда батник пытался его удалить, CMD выдавала правильное сообщение, а в лог писала только путь к файлу и всё. Кроме того, %ERRORLEVEL% при этом почему-то равен нулю. :huh:
Поэтому и пришлось написать вот так

if NOT EXIST %OLD% (
echo -------------------------------------------------------------------
echo "Старый бэкап успешно удален!!!"
echo -------------------------------------------------------------------
GOTO END2
) else (
GOTO END1
)



2) Скрипт НЕ должен удалять актуальный бэкап, если он единственный. Как это сделать?

Сопутствующие вопросы: для чего используются "такие" и 'такие' кавычки?
каким образом разделяются команды в пределах одной строки?

3) Скрипт вообще НЕ должен видеть другие файлы, кроме tt_%DATE%.txt, как это прописать в фильтре dir /b /o-d tt* ?

4) Скрипт НЕ должен удалять файлы, если их меньше 4х штук.

Это сообщение отредактировал(а) ядовитый лис — 29 Dec 2008, 12:01
 
 
apostle
29 Dec 2008, 17:00  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

Цитата:
1)Он должен скидывать в лог конкретную ошибку. Ошибки могут быть следующие:
а. нет актуального бэкапа
б. актуальный бэкап есть, но удалить старый не получается.
в. бэкапов нет вообще.

if else + goto
контрукций типа switch… case в cmd нет.
т.е. при ошибке переходить на соотв раздел с ошибкой и, например, паузить выыполнение скрипта.

%errorlevel% выставляется последней выполненной командой. попробуй проконтолировать его значение сразу после ошбки выводвом в коносль и после прехода, например, в завершающую часть скрипта.


Цитата:
Скрипт НЕ должен удалять актуальный бэкап, если он единственный. Как это сделать?

в случае единственного бекапа он и является актуальным. ход мысли понятен?
ps. стамый старый бекап будет совпадать по имени с самым новым.

Цитата:
Скрипт вообще НЕ должен видеть другие файлы, кроме tt_%DATE%.txt, как это прописать в фильтре dir /b /o-d tt*

зависит от разделителя. dir tt_??_??_????.txt — например, так для формата даты xx_yy_zzzz.

Цитата:
Скрипт НЕ должен удалять файлы, если их меньше 4х штук.

FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

skip=n  — specifies the number of lines to skip at the
beginning of the file.

опять же, улавливаешь идею?
 
 
ядовитый лис
30 Dec 2008, 07:17  


Сейчас вне форума
Группа: Свой человек
Сообщений: 357
Репутация: 1
Регистрация: 20 Sep 05
Живет: SPb

Цитата:
if else + goto
контрукций типа switch… case в cmd нет.
т.е. при ошибке переходить на соотв раздел с ошибкой и, например, паузить выыполнение скрипта.

дада, у меня так и было, я делал 4 GOTO, на 4 случая (по приоритетности):
а) бэкапов нет вообще.
тут была команда dir тратата if %ERRORLEVEL% тратата else GOTO парампарам.
она работала, но после того, как исполняла GOTO, выводила сообщение об ошибке в лог, продолжала выполнять следующие команды.
б) нет актуального бэкапа.
то же самое, что и в пункте а). Только вместо dir команда IF EXIST
в)актуальный бэкап есть, но удалить старый не получается.
то же самое, что в пунктах а) и б). Тут самое непонятное. Вот это:
Цитата:
%errorlevel% выставляется последней выполненной командой. попробуй проконтолировать его значение сразу после ошбки выводвом в коносль и после прехода, например, в завершающую часть скрипта.

я делал, выглядело так:
Код:
DEL /Q %OLD%
echo "%ERRORLEVEL%"

Удаление не получалось, но эррорлевел был равен нулю. Не понимаю, почему.
г) если все прошло успешно, соответствующее сообщение.

Конструкция работала нормально только если задача завершалась успешно. Тогда все красиво, только одно сообщение в логе. Если же в самом начале была ошибка (не было бэкапов), то скрипт выполнял все следующие команды и собирал все остальные ошибки и писал их в лог.

Цитата:
в случае единственного бекапа он и является актуальным. ход мысли понятен?
ps. стамый старый бекап будет совпадать по имени с самым новым.

ход понятен, вывод нет :) скрипт естесственно удаляет актуальный бэкап, если он единственный, он так или иначе самый старый. А так делать не надо.

Цитата:
зависит от разделителя. dir tt_??_??_????.txt — например, так для формата даты xx_yy_zzzz. FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

skip=n  — specifies the number of lines to skip at the
beginning of the file.

Это ща попробую.


Добавлено:
dir /b /o-d tt_??.??.????.txt
вот так запустил, он у меня кроме подходящих увидел вот такие файлы
tt_02.02.tx.txt
tt_02.tx.txt.txt
tt_02.03.txt.txt
tt_1.1.2009.txt
Почему?
И вопрос о кавычках (см. выше) в силе.

А если сделать так:
dir /b /o-d tt_??.??.????.*
то видит такие файлы (помимо нормальных):
tt_13.12.111.txt.txt.txt
tt_21.12.98.txt.txt
tt_02.02.tx.txt
tt_02.tx.txt.txt
tt_02.03.txt.txt
tt_1.1.2009.txt

Оператор ? заменяет ведь один знак, правильно? Этот знак должен обязательно присутствовать? Судя по выполнению команды, под ???? подходит и 1234 и 123 и 12 и 1. А как сделать фильтр, чтоб если уж мне нужны четыре знака, то они должны обязательно присутствовать?

Это сообщение отредактировал(а) ядовитый лис — 30 Dec 2008, 07:44
 
 
apostle
30 Dec 2008, 18:29  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

Цитата:
ход понятен, вывод нет

вывод банальнейший =). если оказывается, что текущий бекап совпадает с самым старым, мы тут же завершаем выполнение скрипта.

Цитата:
Оператор ? заменяет ведь один знак, правильно?

или его отстуствие. но не больше. запись tt_??.??.????.txt следует понимать, как: tt_{<=2 символа}.{<=2 символа}.{<=4 символа}.txt

Цитата:
Удаление не получалось, но эррорлевел был равен нулю. Не понимаю, почему.

предлагаю учесть следующий текст:

Код:
C:\Users\aleksey>dir 1
Volume in drive C has no label.
Volume Serial Number is B4C7-572C

Directory of C:\Users\aleksey

File Not Found

C:\Users\aleksey>echo %errorlevel%
1

C:\Users\aleksey>del 1
Could Not Find C:\Users\aleksey\1

C:\Users\aleksey>echo %errorlevel%
0


и исходить из него.

Цитата:
она работала, но после того, как исполняла GOTO, выводила сообщение об ошибке в лог,

после перехода ч/з goto и выполнения всех действий скрипт следует завершать принудительно. будет ли это exit или break в коде, идущем после перехода или после команды goto, к-рая вернет управление на след команду.

Это сообщение отредактировал(а) apostle — 30 Dec 2008, 18:30
 
 
apostle
30 Dec 2008, 18:34  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

ps. в теле основного скрипта завершение всех операций нужно выствить с помощью exit или break, иначе ты получишь дальнейшую отработку всех "процедур" =). др вариант — вызывать их из др. файлов, но в твоем случае это излишнее усложнение.
 
 
ядовитый лис
31 Dec 2008, 07:11  


Сейчас вне форума
Группа: Свой человек
Сообщений: 357
Репутация: 1
Регистрация: 20 Sep 05
Живет: SPb

Цитата:
предлагаю учесть следующий текст: … и исходить из него.

У меня был ответ Доступ запрещен, поскольку я поставил файлу атрибут read only.
то есть командная строка не всегда невыполненную команду принимает за ошибку. А точнее, именно невыполненную команду DEL или ERASE. Плохо. Только приступил к применению cmd для автоматизации, как сразу столкнулся с ее неудобством.

Цитата:
или его отстуствие. но не больше. запись tt_??.??.????.txt следует понимать, как: tt_{<=2 символа}.{<=2 символа}.{<=4 символа}.txt

нет ли ключей, которые могли бы уточнить мою хочуху, а именно: tt_{=2 символа}.{=2 символа}.{=4 символа}.txt ?

Цитата:
после перехода ч/з goto и выполнения всех действий скрипт следует завершать принудительно. будет ли это exit или break в коде, идущем после перехода или после команды goto, к-рая вернет управление на след команду.

хм..BREAK можно попробовать, она по крайней мере окно не закрывает, посмотрим, как будет на практике.

Вопрос о кавычках (см. выше) в силе. :)

Это сообщение отредактировал(а) ядовитый лис — 31 Dec 2008, 07:12
 
 
apostle
5 Jan 2009, 19:35  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

Цитата:
то есть командная строка не всегда невыполненную команду принимает за ошибку. А точнее, именно невыполненную команду DEL или ERASE. Плохо. Только приступил к применению cmd для автоматизации, как сразу столкнулся с ее неудобством.

скорее, честно, с недостаточным желанием прибегать к первоисточникам =). значение errorlevel выставляется самой программой по рез-там ее выполнения. напрмер, для defrag.exe:
Condition ErrorLevel
Completed, no errors 0
User aborted, cancelled 1
Bad parameter, syntax error 2
Unforeseen, unknown error 3
Low memory condition (RAM) 4
Not used (undefined), general error 5
System, ACL, file mismatch, system wide error 6
Low disk space, under 15% free on current volume 7

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

Цитата:
нет ли ключей, которые могли бы уточнить мою хочуху, а именно: tt_{=2 символа}.{=2 символа}.{=4 символа}.txt ?

тут пока подсказать не могу.

Цитата:
Вопрос о кавычках (см. выше) в силе.

тут еще проще — это настолько именно rtfm, что мне лень лазать по сайту ms с целью копировать сюда мануал от ms.

Цитата:
хм..BREAK можно попробовать, она по крайней мере окно не закрывает, посмотрим, как будет на практике.

чтобы не закрывать окно нужно вывести перед выполнением break ли, exit ли команду pause или диалоговое окно =)

Это сообщение отредактировал(а) apostle — 5 Jan 2009, 19:36
 
 
apostle
5 Jan 2009, 19:41  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

пример аналогичной ошибки с errorlevel для bcpedit
 
 
ядовитый лис
11 Jan 2009, 13:43  


Сейчас вне форума
Группа: Свой человек
Сообщений: 357
Репутация: 1
Регистрация: 20 Sep 05
Живет: SPb

Цитата:
я бы предпожил, что ошибка будет выдана, когда команда не сможет удалить существующий файл (недостаточно прав, например).

как раз в этом случае команда ошибку и не выдает. Удалить файл не получается, потому что недостаточно прав. Но errorlevel равен нулю.
 
 
apostle
11 Jan 2009, 17:10  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

ядовитый лис
стало быть, ошибка в реализации команды.
 
 
ядовитый лис
12 Jan 2009, 09:16  


Сейчас вне форума
Группа: Свой человек
Сообщений: 357
Репутация: 1
Регистрация: 20 Sep 05
Живет: SPb

Цитата:
после перехода ч/з goto и выполнения всех действий скрипт следует завершать принудительно. будет ли это exit или break в коде, идущем после перехода или после команды goto, к-рая вернет управление на след команду.

почему-то break не помогает.. ставил его так
Код:
if     %ERRORLEVEL% NEQ 0 (
     echo Бэкапов нет вообще!!!
     echo.
   GOTO END1
     break
  )


и так
Код:
:END1
echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
echo "^^^^^^^^  Удаление не прошло !!!  Конец !!!  ^^^^^^^^"
echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
echo.
echo ###################################################################
break


все равно END2 исполняется :huh:

Добавлено:
Pause останавливает выполнение следующих команд, это уже хорошо, но зато пишет в лог "Нажмите любую кнопку", а мне это не надо. Что ж такое-то <_<
Как сделать, чтоб не записывалась эта фигня?

Это сообщение отредактировал(а) ядовитый лис — 12 Jan 2009, 10:23
 
 
apostle
12 Jan 2009, 20:33  


Сейчас вне форума
Группа: Модератор
Сообщений: 3532
Репутация: 46
Регистрация: 11 Oct 04
Живет: spb

попробуй
Код:
if     %ERRORLEVEL% NEQ 0 (
    echo Бэкапов нет вообще!!!
    echo.
  GOTO END1
    break (или exit)
    break (или exit)
 )
 
 
47 ответов с 27 May 2005, 12:23 Версия для печати
Страницы: (4) 1 2 [3] 4 
<< Назад в Windows
ОтветитьНовая темаНовый опрос