Ru-Board.club
← Вернуться в раздел «Программы»

» Командная строка, батники, сценарии (bat, cmd)

Автор: Maza Faka
Дата сообщения: 31.07.2007 10:05
dardreams

Код:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (list.txt) do call :sub "%%a"
goto :eof

:sub
set str=%~1
for /l %%b in (0,1,254) do if not "!str:~%%b,1!" equ "" (echo !str:~%%b,1!>> out.txt)
Автор: freeminded
Дата сообщения: 01.08.2007 11:10
Пожалуйста, подскажите, как решить следуюющую проблему:

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

1с_yyyymmdd.rar

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

Плз, подскажите, где можно нарыть инфу, или помогите разобратся (я даже не представляю как в строке сделать все это)
Автор: vserd
Дата сообщения: 01.08.2007 12:02
freeminded
В http://forum.ru-board.com/topic.cgi?forum=62&bm=1&topic=10650#1
Есть примеры как можно вычислить дату на день раньше. Модифицируй его на то чтобы вычислялась дата за 4 дня от твоего.
Затем формируешь список файлов которые не нужно удалять, и удаляешь все которые не всписке.
Также почитай версии для печати (эта тема и все "Задачи на bat-файлах" ), наверняка эта тема уже поднималась.
Автор: KapralBel
Дата сообщения: 01.08.2007 12:05
freeminded
На скорую руку
по команде Dir - формируешь список файлов сортированный по имени или дате. в результате 5 и далее строки - это файлы к удалению
Командой For /F пропускаешь 4 строки и начинаешь удалять остальные файлы
Автор: Maza Faka
Дата сообщения: 01.08.2007 12:29
freeminded
Скачай утилиту forfiles.exe, помести её в папку WINDOWS и запускай этот батник из директории с архивами:

Код:
@echo off
forfiles /p C:\Test /m *.rar /d -4 /c "cmd /c del /f /q @file"
Автор: freeminded
Дата сообщения: 01.08.2007 15:18
KapralBel

Цитата:
freeminded
На скорую руку
по команде Dir - формируешь список файлов сортированный по имени или дате. в результате 5 и далее строки - это файлы к удалению
Командой For /F пропускаешь 4 строки и начинаешь удалять остальные файлы




Цитата:

d:
cd d:\1cbase
dir d:\1cbase\*.rar /o /d /4
for /f

А как дальше? с for`ом я вовсе еще не разобрался

Maza Faka

Цитата:
Скачай утилиту forfiles.exe

хотелось бы сделать это "своими руками". Проблему решил но подобным путем и без батника (использовал спец. прогу для бекапов)
Автор: Maza Faka
Дата сообщения: 01.08.2007 15:27
freeminded

Цитата:
хотелось бы сделать это "своими руками".

Утилита forfiles.exe входит в состав WindowsResourceKit NT, 2000, 2003, чем не
Цитата:
"своими руками"
?


Цитата:
Проблему решил но подобным путем и без батника (использовал спец. прогу для бекапов)

Дык надо было сразу искать спец.софт, а не просить решить проблему
Цитата:
"своими руками"

Автор: KapralBel
Дата сообщения: 01.08.2007 15:29
freeminded

Код: @Echo Off
D:
CD D:\1CBase
dir /o:-n /b *.rar>delete.lst
For /F "skip=4" %%a in (delete.lst) Do Echo Del %%a /q
Автор: freeminded
Дата сообщения: 02.08.2007 10:19

Цитата:
Код:@Echo Off
D:
CD D:\1CBase
dir /o:-n /b *.rar>delete.lst
For /F "skip=4" %%a in (delete.lst) Do Echo Del %%a /q



Спасибо.
Вижу - сначала по команде Dir формируется текстовый документ c отсортироваными файлами, а потом for пропускает 4 первых файла и убивает все лишнее.... интересно...
даже говорит, что удалено! прикольно.

А если файлов < 4, например 2, что тогда?

Добавлено:
Дык надо было сразу искать спец.софт, а не просить решить проблему

Цитата:
Цитата:"своими руками"


Тема ведь посвящается bat`анике? Если бы у меня было время, я бы батником сделал, все, но так как я все должен был сделать все за день, и при начальном уровне знания WHS равным 0, пришлось воспользоватся резервным вариантом
Автор: KapralBel
Дата сообщения: 02.08.2007 10:27
freeminded
1. Он только рапортует, а не удаляет - удали слово Echo
2. Обычно архивную копию делаю каждый день, вот из этого я и исходил
3. Допустим архивная копия не сделалась в какой-то день, напрмер
01.08 -есть
02.08 - нет
03.08 - есть
04.08 - есть
05.08 - есть пытаемся удалить лишние
их только 3, а не 4 значит не удаляем
если 6-го все делается правильно - то удаляется за 1-е число

Таким образом у тебя архивные копии не за последних 4 дня хранятся, а последних 4 архивных копии. что в случае всяких неудач все таки лучше чем 0 архивных копий

Добавлено:

Цитата:
Тема ведь посвящается bat`анике? Если бы у меня было время, я бы батником сделал, все, но так как я все должен был сделать все за день, и при начальном уровне знания WHS равным 0

Вообще имелось в виду не другие скриптовые языки, а всяческие утилиты
Потому что сам язык встроенного командного интерпретатора - достаточно ограничен, и сложные вещи (твоя задача к ним не относится) на нем если можно сделать - то с такими извратами - что работать будет достаточно долго
Кстати я бы порекомендовал не WSH а PowerShell - M$ планирует перейти на него

Кстати задача найти дату отличающуюся от нужной на N дней там решается весьма просто

Код: PS D:\> $CurrentDate=Date
PS D:\> $LastDate=$CurrentDate.AddDays(-138)
PS D:\> $CurrentDate

2 августа 2007 г. 10:32:32

PS D:\> $LastDate

17 марта 2007 г. 10:32:32
PS D:\>
Автор: mvg1952
Дата сообщения: 02.08.2007 10:42
Уважаемые, ибн ГУРУ, вопрос от неофита: какое есть ограничение на количество строк, команд в BAT файле?
( поиск не помог, а былой опыт уже и подзабыл, когда натыкался на ето)
Автор: KapralBel
Дата сообщения: 02.08.2007 10:45
mvg1952
Что-то я ни разу не нарывался на ограничение
Хотя батнички у меня по объему - огого
Но если (если) что... то выноси часть кода в другой батник и делай команды

Код:
Call Part1.cmd
Call Part2.cmd
Call Part3.cmd
Call Part4.cmd
Автор: mvg1952
Дата сообщения: 02.08.2007 10:56
KapralBel
Спасибо, так и сделаю
Автор: Maza Faka
Дата сообщения: 02.08.2007 14:01
freeminded

Цитата:
Тема ведь посвящается bat`анике?

Дык, а я на чём написал? На Delfi, что ли?


Цитата:
Если бы у меня было время, я бы батником сделал

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


Цитата:
при начальном уровне знания WHS равным 0

Где в моём коде ты увидел WSH? И неужели требуется так много знаний что бы в консоли выполнить forfiles /?


Цитата:
пришлось воспользоватся резервным вариантом

А чем конкретно не устроил мой вариант?
Автор: Stanley_Tweedle
Дата сообщения: 02.08.2007 18:03
Maza Faka

Твой способ решения с forfiles самый лучший и наглядный!
Читая вашу ветку переписал все скрипты на использование forfiles.
Более простого и наглядного способа без использования сторонних программ думаю просто нет
Автор: dardreams
Дата сообщения: 03.08.2007 09:09

Цитата:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (file.txt) do (
set "count=0"
set "text=%%a"
call :show
)
goto :EOF
:show
if "!text:~%count%,1!"=="" (goto :EOF)
echo !text:~%count%,1!
set /a "count+=1"
goto show

Спасибо за это. Для меня слишкком сложно чтобы понять что тут и как. Можно попросить еще чтобы . если в файле слово начинается с новой строки, чтобы выводил хотя бы какаойнить символ напирмер:

------------------------------
qwe
asd
cxz
sdf
qwe
------------------------------

и вывод был такой

qwe_asd_cxz_sdf_qwe

Добавлено:
огромное спасибо. Сам смог разобраться !!!

Добавлено:
А почему он пробелы не выводит ?

Цитата:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (file.txt) do (
set "count=0"
set "text=%%a"
call :show
)
goto :EOF
:show
if "!text:~%count%,1!"=="" (goto :EOF)
echo !text:~%count%,1!
set /a "count+=1"
goto show

Автор: Maza Faka
Дата сообщения: 03.08.2007 10:38
dardreams

Цитата:
А почему он пробелы не выводит ?

Попробуй так:

Код:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (file.txt) do call :sub "%%a"
pause
goto :eof

:sub
set str=%~1
for /l %%b in (0,1,254) do if not "!str:~%%b,1!" equ "" (echo. !str:~%%b,1!)
Автор: Yuki2003
Дата сообщения: 03.08.2007 13:18
Проблема вылезла - в именах каталогов встречаются символы & и ! (и может еще - какие?). Как бы это "обойти"?
Автор: Maza Faka
Дата сообщения: 03.08.2007 13:29
Yuki2003

Цитата:
Проблема вылезла

Поподробней пожалуйста, что конкретно нужно сделать?
Автор: Yuki2003
Дата сообщения: 03.08.2007 13:45
Maza Faka
Все тот же скрипт доделываю.
List.txt:

Цитата:
C:\!yy\*
C:\&yy\*

Backup.bat:

Код: For /f "tokens=2*" %%a In (
'reg query HKLM\SOFTWARE\7-Zip /v Path 2^>nul ^| Findstr /i Path'
) Do Set backup="%%b\7z.exe"
If Not Defined backup Echo Файловый архиватор 7-Zip не установлен>> "!archDate! errors.txt" & GoTo :eof

For /f "delims=" %%c In (List.txt) Do (
Set data=%%c
Set count=0
Call :GetCount "%%c"
!backup! u "Backup !archName!.7z" "!data!" -up1q0r2x2y2z1w2 -mx9 -ms=off>> "log.txt" 2>&1)
Goto :eof

:GetCount
Set archName=%~1

:Again
For /f "delims=\* tokens=1*" %%d In ("!archName!") Do (
Set /a count+=1
Set archName=%%e)
If Not "!archName!"=="" GoTo Again
For /f "delims=\ tokens=%count%" %%f In ("%data%") Do Set archName=%%f
Goto :eof
Автор: KapralBel
Дата сообщения: 03.08.2007 13:49
Yuki2003
А самый простой способ - переименовать эти папки?
Автор: Yuki2003
Дата сообщения: 03.08.2007 13:52
KapralBel
Это каталоги на серверах с неизвестным заранее местонахождением, так как невозможно запретить юзерам создавать их. Насчет переименовать итоговое имя архива - возможно, но если заменять на 1 символ (например _) то каталоги из приведенного примера запакуются в один архив, да и хотелось бы обойтись без переименования.
Автор: Elroir
Дата сообщения: 03.08.2007 13:53
Yuki2003
На какой команде проявляется ошибка с "&" и "!"?
Автор: Yuki2003
Дата сообщения: 03.08.2007 14:02
Стоп.
Взял в кавычки, так:
Set archName="%~1"
Сообщение об ошибке нет, но и архива нет.
Добавил после:
Echo !archName!
Получил:
"C:\yy\*"
"C:\&yy\*"
Вместо:
"C:\!yy\*"
"C:\&yy\*"

Добавлено:
еще тут добавил кавычки - Set archName="%%e"
разбираюсь...

Добавлено:
Поправил кавычки - проблема с символом & отпала.
Осталась проблема с символом !.
For /f "delims=" %%c In (List.txt) Do (
Set data=%%c
echo %%c
- дает С:\yy\* вместо С:\!yy\*

То есть еще на этапе чтения из List.txt проблема.
Автор: vserd
Дата сообщения: 03.08.2007 14:36
Yuki2003

Цитата:
For /f "delims=" %%c In (List.txt) Do (
Set data=%%c
echo %%c
)

на твоем примере у меня дает
C:\!yy\*
C:\&yy\*


И попробуй поиграться с заменой ! на ^! т.е. маскировкой символов.
Надеюсь это ты проштудировал http://forum.ru-board.com/topic.cgi?forum=62&topic=10650&start=0&limit=1&m=6#1
на предемет передачи/замены & ?
Автор: Elroir
Дата сообщения: 03.08.2007 14:44
Yuki2003
Единственный вариант, который я вижу - не использовать "setlocal enabledelayedexpansion" и, соответственно, конструкции вроде !переменная!.
То есть примерно так:

Код:
For /f "tokens=2*" %%a In (
'reg query HKLM\SOFTWARE\7-Zip /v Path 2^>nul ^| Findstr /i Path'
) Do Set "backup="%%b\7z.exe""
If Not Defined backup Echo Файловый архиватор 7-Zip не установлен>> "%archDate% errors.txt" & GoTo :eof

For /f "delims=" %%c In (List.txt) Do (
Set "data=%%c"
Set "count=0"
Call :GetCount "%%c"
call :Process
)
Goto :eof

:Process
%backup% u "Backup %archName%.7z" "%data%" -up1q0r2x2y2z1w2 -mx9 -ms=off>> "log.txt" 2>&1
goto :EOF


:GetCount
Set "archName=%~1"

:Again
For /f "delims=\* tokens=1*" %%d In ("%archName%") Do (
Set /a "count+=1"
Set "archName=%%e")
If Not "%archName%"=="" GoTo Again
For /f "delims=\ tokens=%count%" %%f In ("%data%") Do Set "archName=%%f"
Goto :eof
Автор: Yuki2003
Дата сообщения: 03.08.2007 14:44

Цитата:
vserd
на твоем примере у меня дает
C:\!yy\*

чудеса даже не знаю, может версия cmd разная... У меня от xp sp2.

Цитата:
vserd
Надеюсь это ты проштудировал

Спасибо, смотрю...
Автор: Elroir
Дата сообщения: 03.08.2007 14:50
Yuki2003

Цитата:
чудеса даже не знаю, может версия cmd разная

Нет - не чудеса. Просто не используется директива "setlocal enabledelayedexpansion"
Автор: Yuki2003
Дата сообщения: 03.08.2007 14:52
Elroir
Да, в твоем варианте проблема с ! пропала! Но "вернулась" проблема с &. Буду смотреть как ты посоветовал...
Автор: vserd
Дата сообщения: 03.08.2007 14:57
Yuki2003

Цитата:
У меня от xp sp2.

Аналогично. Видимо проблема в комплексности или в том, что ты запускаешь этот батник без закрытия окна CMD.
Кинь последнюю версию под тег more. Прогоню на свое машине.

Elroir

Цитата:
использовать "setlocal enabledelayedexpansion" и, соответственно, конструкции вроде !переменная!.

Тогда нет смысла городить этот батник. На этой функциональности он построен, без нее работать не будет.



Народ, а у кого как отрабатывет код

For /f "delims=" %%c In (List.txt) Do (
Set data=%%c
echo %%c
)
на List.txt следующего содержания:
C:\!yy\*
C:\&yy\*

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879

Предыдущая тема: Problemi s zagruzkoy XP!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.