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

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

Автор: Smitis
Дата сообщения: 08.09.2009 14:49
bomzzz

Цитата:
а адо вообще из другой оперы

ADO из области обработки баз данных. DBF - это файл базы данных.

Kilyan

Цитата:
может у вас примерчик найдется ?


Примерчика у меня к сожалению не осталось, уже несколько лет прошло, когда я с этим возился. Но начать поиск можно с сайта, ссылку на который я дал.

Вот ещё утилита для DBF: http://forum.ru-board.com/topic.cgi?forum=35&topic=24522&start=120#lt
Сейчас проверил - два простых DBF одинаковой структуры без memo объединил.
Автор: crom86
Дата сообщения: 08.09.2009 15:41
Доброго времени суток.

Помогите начинающему:
есть каталог, в нём каждый день появляется одна папка (имя всегда разное). Нужно имя этой папки присвоить переменной (средствами cmd). Как?

Заранее благодарен.
Автор: bomzzz
Дата сообщения: 08.09.2009 22:47

Цитата:

ECHO OFF
COLOR 9F
CLS
FOR /R C:\TEMP %%I IN (.) DO SET MyPapka=%%~NI%
ECHO %MyPapka%
PAUSE

где c:\temp путь где папка валяется


Цитата:

ECHO OFF
COLOR 9F
CLS
FOR /R C:\TEMP %%I IN (.) DO SET MyPapka=%%~NI%
IF %MyPapka%==TEMP (
ECHO NETU PAPKI
) ELSE (
ECHO %MyPapka%
)
PAUSE

то есть - если папки еще нету - то переменной присвоится значение корневой папки, поэтому мона определить есть папка или нету.
при сравнении играет роль заглавные или нет буквы в имени корневой папки TEMP<>Temp
Автор: Smitis
Дата сообщения: 08.09.2009 22:56
crom86

Цитата:
Помогите начинающему:
есть каталог, в нём каждый день появляется одна папка (имя всегда разное). Нужно имя этой папки присвоить переменной (средствами cmd). Как?



Код:
@echo off
for /d %%f in ( * ) do set d=%%f
echo %d%
Автор: crom86
Дата сообщения: 09.09.2009 09:16
Всем большое спасибо. Всё работает.
Автор: vITSaotome
Дата сообщения: 09.09.2009 11:14
Привет всем. По-тихоньку начинаю осваивать возможности cmd, но появилась задача, которую нужно быстро решить (сегодня). Прошу помощи.

Есть папка с определенным именем Work (путь к папке должен указываться в скрипте). В этой папке создаются с разным уровнем вложенности другие папки и файлы. Среди созданных подпапок иногда проскакивают папки с именем "Temp". Нужно их отыскивать и удалять все содержимое.

Спасибо, заранее.
Автор: Malegik79
Дата сообщения: 09.09.2009 11:26
Уважаемые подскажите плиз, как в батнике узнать размер файла, записать размер в файл.txt и сравнить со значением которое находится в текстовом файле?
Автор: vITSaotome
Дата сообщения: 09.09.2009 11:29
В принципе есть готовое похожее решение:

@Echo Off

Set TmpPath="D:\Work"
Set InStrVar=Temp
Set FilesMask=*.*

For /R "%TmpPath%" %%i In (.) Do Call :CheckTemp "%%i"


:CheckTemp
Set CurrDir=%~1
Set CurrDir=%CurrDir:~0,-2%

For %%a In ("%CurrDir%") Do Set "DirName=%%~nxa"

For /F "delims=" %%b In ('Echo %DirName%^| Find /I "%InStrVar%"') Do Set "DelPath=%CurrDir%\%FilesMask%"

If /I Exist "%DelPath%" (
Del /Q /F "%DelPath%"
) Else (
Exit /b 1
)

Но здесь удаляются все папки, в имени которых найдено слово "Temp", т.е в том числе Temp_Sales и т.д. + если найдена папка "temp", а в ней находится еще одна папка "temp", то удаляются только файлы (мне нужно, чтобы удалялись и файлы, и подпапки, найденные в папке с именем = "temp").
Автор: bomzzz
Дата сообщения: 09.09.2009 12:44
Malegik79

Цитата:

%~zI Замена %I размером файла.


vITSaotome наворочено очень, хоть бы ремарки в своем скрипте расписал

crom86
вариант for /d %%f in (c:\temp\*) do set d=%%~Nf% тоже имеет свой смысл, если имя корневой папки может совпадать с именем появляющейся вложенной папки. тогда, при отсутствии вложенной папки, переменной вообще ничего не присваивается, и возникает ошибка в IF. ну ее конечно легко обойти if errorlevel , но поэкпериментировал, чета с кодом ошибки не получилось, так проще можно сначала проверку сделать if exist, или присвоить ей некое значение сначала. легко можно ключевую строку изменить если будет необходимость.
через /R ищется включая субдиректории.

Цитата:

ECHO OFF
COLOR 9F
CLS
set MyPapka=TEMP
for /d %%f in (c:\temp\*) do set MyPapka=%%~Nf%
IF %MyPapka%==TEMP (
ECHO NETU PAPKI
) ELSE (
ECHO %MyPapka%
)
PAUSE
Автор: Smitis
Дата сообщения: 09.09.2009 19:19
vITSaotome

Цитата:
Есть папка с определенным именем Work (путь к папке должен указываться в скрипте). В этой папке создаются с разным уровнем вложенности другие папки и файлы. Среди созданных подпапок иногда проскакивают папки с именем "Temp". Нужно их отыскивать и удалять все содержимое.


Примерно так, сильно не тестировал, некогда:

Код:
@echo off

:: Переходим к папке Work
:: Выход, если папка не существует
cd /d D:\Work || exit

:: Цикл по всем папкам
for /f "delims=?" %%d in ( 'dir /b /s /ad *' ) do call :ddd "%%~d"
goto :eof

:ddd

:: Проверка имени
if /i not "%~nx1" == "temp" goto :eof

:: Переход в папку
pushd "%~1" 2> nul || goto :eof
:: Для безопасности проверяем ещё раз,
:: действительно ли переход осуществился :-)
if /i not "%cd%" == "%~1" goto :eof

:: Удаляем содержимое, но не папку
echo Clear %1
rd /s/q . 2> nul

popd
Автор: Smokeer
Дата сообщения: 10.09.2009 06:12
Мне нужно скопировать файлы из папки А в папку Б. При этом если файлы в А больше соответствующего файла в Б - переписать. Иначе - пропустить данный файл.
Как сравнить размеры файлов в рамке командной строки? ОЧЕНЬ желательно не использовать сторонние утилиты.
Автор: Leshgan
Дата сообщения: 10.09.2009 08:22
Почему может быть такая ошибка?


Код:
D:\Backup>set /a aaa=08
Неправильное число. Числовые константы должны быть десятичными (17)
шестнадцатеричными (0x11),или восьмеричными (021).
Автор: 01MDM
Дата сообщения: 10.09.2009 08:56
Leshgan

Код:
set /a ddd=1%dd:~0,2%-100
Автор: vITSaotome
Дата сообщения: 10.09.2009 11:41
Smitis, большое спасибо! Скрипт полностью рабочий.
Автор: dimpase
Дата сообщения: 10.09.2009 16:54
Привет всем еще раз.Скажите как мне записать пинг в текст чтобы после времени задержки стояло еще время.
И все в одной строке.
Заранее спасибо.
Автор: 01MDM
Дата сообщения: 10.09.2009 17:47
dimpase
Если не ошибаюсь, то этого сделать нельзя в реальном времени. Весь вывод в консоль идет только после того, как команда отработает. Т.е пакетом данных сразу.
пример:

Код:
C:\> for /f "tokens=*" %i in ('ping ya.ru') do @echo %time% %%i
Автор: rubtraders
Дата сообщения: 11.09.2009 09:43
Уважаемые, подскажите.

Задача найти все видео файлы в сети. на всех расшареных ресурсах. а так же на невидимых
(типа \\server\video$)


Цитата:
FOR /F "skip=3 delims=\ " %%A IN ('NET VIEW') DO FOR /F "skip=7 delims=\ " %%B IN ('NET VIEW \\%%A') DO dir /S /B "\\%%A\%%B\*.avi"


такой конструкцией получается сделать список, но только не на скрытых:

хотелось бы ещё передать этот вывод для команды copy или del
Автор: Smokeer
Дата сообщения: 11.09.2009 16:12
01MDM
Спасибо!
Возникла необходимость усовершенствовать скрипт. Нужно копировать каталог во второй, но при этом проверять есть ли каждый отдельный копируемый файл в каталоге-получателе. (и если есть - делать его резервную копию добавсяя к имен .bac) Загвоздка какраз в проверке есть ли во втором каталоге одноимённый файл.
Автор: ComradG
Дата сообщения: 11.09.2009 18:29
Может кому интересно: принцип управления сонсольными прогами на примере ESET NOD32 (сам пользуюсь Каспером !)
[more]О преимуществах ESET NOD32, полагаю, лишний раз говорить не стоит, тем более с одной стороны, это был бы пиар в сторону ESET, с другой – выбор антивируса является сугубо личным делом. Поэтому я и решил не углубляться в структурные особенности, да и менее всего мне хочется кого-то обидеть. Скажу одно, по вопросам лицензий обращайтесь в ‘Варезник’ (спасибо leric75 за оперативность и своевременную помощь).
Возможно те, кто не любит GUI (как, например, я), в ESET NOD32 предусмотрена консольная версия сканера, обладающая, кстати, более широким функционалом, нежели GUI-шная версия. Об этом можно почитать в мануале программы. Однако в путях реестра консольная версия сканера не прописывается (что довольно логично в целях безопасности), а потому всякий раз переходить в папку с программой, чтобы запустить сканер представляется делом неблагодарным, и даже более – ужасно непрактичным (ох, и убили бы меня филологи за подобные обороты речи!) Поэтому, предлагаю вашему вниманию батник, заметно упрощающий работу с консольным сканером.
Итак, суть батника состоит в следующем:
1)Если лога о ранее проведенном сканировании не существует, то он будет создан в папке с батником (в примере это C:\BIN);
2)Если лог имеется, то ему присваивается в качестве имени текущая дата и время с точностью до минут (DDDD-TTTT.txt), после чего он перемещается во вложенную папку директории (C:\BIN\logs);
Основные принципы, думаю, будут понятны из контекста.

Код: @echo on
@rem Поиск результатов предыдущего сканирования: если сканирование не проводилось, то
@rem поиск прерывается и происходит инициализация нового сканирования
@echo ђ вЁдЁЄ жЁп б«г¦Ў...
@if not exist %cd%\log.txt goto end else goto begin
@rem Метка альтернативных настроек
:begin
@rem Дата и время обрабатываются без разделительных знаков
@for /f "tokens=1,2,3* delims=. " %%i in ('date /t') do @(
set date=%%i
set mont=%%j
set year=%%k
)
@for /f "tokens=1,2* delims=: " %%i in ('time /t') do @(
set hour=%%i
set mint=%%j
)
@rem Установка переменной вывода
@set file=%cd%\logs\%date%%mont%%year%-%hour%%mint%.txt
@rem Обработка предыдущего файла
@for /f "eol=# tokens=1,2* delims=_ " %%i in (log.txt) do @echo %%i %%j %%k >> %file%
@rem Удаление использованных переменных
@set date=
@set mont=
@set year=
@set hour=
@set mint=
@set file=
@echo ђ вЁдЁЄ жЁп § ўҐаиҐ- ...
@rem Метка альтернативных настроек
:end
@echo off
@echo on
@rem Удаление предыдущего отчета: если его не удалить, отчет о текущем сканировании
@rem будет выведен в конец предыдущего, что противоречит идеи резервирования копий
@if exist %cd%\log.txt (del /f log.txt)
@rem Установка параметров сканера
@echo “бв -®ўЄ ЇҐаҐ¬Ґ--ле б«г¦Ў...
@set scan="C:\Program Files\ESET\ESET NOD32 Antivirus"
@set file=%cd%
@rem Получение короткого имени пути
@for /d %%i in (%scan%) do @(set scan=%%~si)
@rem Перечисление параметров сканера
@echo Ќ з «® -вЁўЁагб-®Ј® бЄ -Ёа®ў -Ёп...
@cd /d %scan% && ecls /aind /boots /files C: D: /subdir^
/rtp /sfx /pattern /adv-heur /preserve-time /action=prompt /log-file=C:\BIN\log.txt
@rem Переход в папку с отчетом
@echo ЋЎа Ў®вЄ ¤ --ле ®взҐв ...
@cd /d %file% && log.txt
@rem Удаление использованных переменных
@echo “¤ «Ґ-ЁҐ ЇҐаҐ¬Ґ--ле б«г¦Ў...
@set scan=
@set file=
@rem Завершения пакетного файла
@echo ‡ ўҐаиҐ-ЁҐ а Ў®вл...
@exit /b
Автор: Smitis
Дата сообщения: 11.09.2009 20:50
Leshgan

Цитата:
Почему может быть такая ошибка?
D:\Backup>set /a aaa=08
Неправильное число. Числовые константы должны быть десятичными (17)
шестнадцатеричными (0x11),или восьмеричными (021).

По-русски же написано:

Цитата:
Неправильное число. Числовые константы должны быть десятичными (17)
шестнадцатеричными (0x11),или восьмеричными (021).

07 - правильная восьмеричная константа,
08 - неправильная восьмеричная константа
Автор: 01MDM
Дата сообщения: 12.09.2009 09:02
Smokeer

Цитата:
Возникла необходимость усовершенствовать скрипт.

Нужно проверять файлы по размеру или в любом случае отправлять их *.bac?
Автор: Kiev78
Дата сообщения: 12.09.2009 19:14
Есть ли какая-нибудь консольная утилита, которая бы возвращала ID3 теги указанного файла. Тогда быстрая сортировка mp3 файлов по каталогам выполнялась бы командой что-то типа такой:
FOR /r c:\unsorted_music %%a in (*.mp3) do move %%a c:\sorted_music\%Artist%\%Year%-%Album%\%%a
Ну вы поняли, раскидывание файлов по каталогам %Artist% внутри которых каталоги %Year%-%Album% (или просто %Album% - не суть важно). То есть мы пишем что-то типа %Artist% а прога заменяет его на считанное из файла значение (например на Nirvana) К сожалению командная строка не понимает Ид3 тегов и переменных типа %Artist%. Может есть какая нибудь навороченная консольная прога (типа xxcopy, которая тоже к сожалению этого не может). Если ничего такого нет, то придется писать AutoIt скрипт, что немного сложнее.
Автор: gorenski
Дата сообщения: 13.09.2009 03:12
Kiev78
Может быть не стоит усложнять, а воспользоваться программой Tag&Rename
Автор: bomzzz
Дата сообщения: 13.09.2009 05:32

Цитата:

в HS-paket (Пакет утилит для организации интерфейса в bat-файлах ) входит HS_play, для проигрывания wav файлов. вот это тоже самое только весит 1,50 КБ (1 536 байт) против 15,5 КБ (15 872 байт), правда не умеет проигрывать несколько файлов из командной строки. работает почти так же, только надо косую черту указать перед путем к файлу.
"C:\sound.exe" /C:\WINDOWS\Media\chimes.wav
sound.exe

а вот такие две утилиты не входят
cdclose.exe 2,50 КБ (2 560 байт)
cdopen.exe 2,50 КБ (2 560 байт)

параметром командной строки через обратный слеш можно задать заголовок окна, а можно и не задавать. "C:\cdopen.exe" /bomz или "C:\cdclose.exe" /bomz



вроде батником сидюк не открывается. хотя странно.
Автор: 01MDM
Дата сообщения: 13.09.2009 06:19
Kiev78
Mediainfo

bomzzz
Универсальная утилита NirCmd открывает и закрывает лоток.

Автор: bomzzz
Дата сообщения: 13.09.2009 06:32
но она про это не спрашивает и статус сд не проверяет

надо было наверно в одну запихать и через 0 и 1 вызывать открыть закрыть.

тогда уж надо было все в одну пихать... впрочем я вообще в таких утилитах смысла не вижу - если батники чего не могут значит надо на вбс скрипте писать.
Автор: Kiev78
Дата сообщения: 13.09.2009 07:04

Цитата:
Может быть не стоит усложнять, а воспользоваться программой Tag&Rename

Спасибо, я как раз воспользовался Tag&Rename (хотя если бы не подсказали, я бы по названию не догадался, что она может не только переименовывать, но и перемещать).
Автор: bomzzz
Дата сообщения: 13.09.2009 20:09
Новое творение родил. заменитель утилиты HS_MESSAGE из HS_Packet.
работает таким образом.
MsgBox.exe /Text/Title/const
где Text - текст диалогового сообщения, для переноса строки используется знак | .
Title - заголовок окна диалогового сообщения
const - параметры диалогового окна. получается таким образом из этой таблицы.

Цитата:

Константа Значение Описание
OKOnly 0 Выводится кнопка ОК.
OKCancel 1 Выводятся кнопки ОК и Отмена (Cancel).
AbortRetryIgnore 2 Выводятся кнопки Стоп (Abort), Повтор (Retry) и Пропустить (Ignore).
YesNoCancel 3 Выводятся кнопки Да (Yes), Нет (No) и Отмена (Cancel).
YesNo 4 Выводятся кнопки Да (Yes) и Нет (No).
RetryCancel 5 Выводятся кнопки Повтор (Retry) и Отмена (Cancel).
6 Отмена Повторить Продолжить
Critical 16 Выводится значок Stop Mark.
Question 32 Выводится значок Question Mark.
Exclamation 48 Выводится значок Exclamation Mark.
Information 64 Выводится значок Information Mark.
128 выровнять текст справа
1024 выровнять текст слева
DefaultButton1 0 По умолчанию в окне выбирается первая кнопка.
DefaultButton2 256 По умолчанию в окне выбирается вторая кнопка.
DefaultButton3 512 По умолчанию в окне выбирается третья кнопка.
DefaultButton4 768 По умолчанию в окне выбирается четвёртая кнопка.
ApplicationModal 0 Диалоговое окно выводится в модальном режиме. Пользователь должен ответить на запраос, прежде чем он сможет продолжить работу приложения. Но он может перейти работать в окна другого приложения или работать со всплывающими окнами данного приложения
SystemModal 4096 Диалоговое окно выводится в модальном режиме и располагается сверху всех запускаемых приложений.Используется этот параметр для предупреждения о серьезных о серьезных ошибках, требующих немедленного вмешательсьва.
16384 - справка (событие не обрабатывается)


Например 4096+256+32+3=4387
модальный режим поверх окон, дефолтная кнопка 2, иконка вопросика, кнопки: да нет отмена
c:\MsgBox.exe /bomz|bomz|bomz/bomz/4387
любое значение можно опустить.
но в широком смысле нельзя опустить текст и начать с заголовка или свойств окна, тогда опускаемое значение нужно пустым знаком - ///0 . справа налево можно - опустить свойства окна - тогда они будут равны 0.



Цитата:

Возвращаемое значение:
OK 1 Нажата кнопка ОК.
Cancel 2 Нажата кнопка Отмена (Cancel).
Abort 3 Нажата кнопка Стоп (Abort).
Retry 4 Нажата кнопка Повтор (Retry).
Ignore 5 Нажата кнопка Пропустить (Ignore).
Yes 6 Нажата кнопка Да (Yes).
No 7 Нажата кнопка Нет (No).
10 повторить
11 продолжить

MsgBox.exe2,00 КБ (2 048 байт)

получилась полно функциональной, компактной (2,00 КБ (2 048 байт) против 16,5 КБ (16 896 байт)), плюс есть перенос строки. знаком | пришлось пожертвовать, как впрочем и /


пока ошибки исправлял интересное свойство обнаружил - можно зеркально отразить окошко. то есть крестик будет в левом верхнем, "да" справа "нет" слева.

пропуск строки || , пропуск значения слева направо //.
| - заменяется chr(10), перенос строки.



Цитата:

1048576 пасхальное яйцо

MsgBox-.exe2,00 КБ (2 048 байт)
сделал сразу вариант - знак переноса строки ` знак разделителя значений командной строки ~, верхнее и нижнее значения самой верхней левой клавиши клавиатуры в английской раскладке(в русской это буква ёЁ). то есть командная строка будут выглядеть так
c:\MsgBox-.exe ~Text`aaa`bbb`ccc``ddd`eee~Title~4387


еще себе делал две такие утилиты - одна помещает содержимое буфера обмена в файл рядом с собой с названием CLPB.txt, а вторая из файла рядом с собой с названием TOCLPB.txt содержимое помещает в буфер обмена.

CLPB.exe10,2 КБ (10 490 байт)
TOCLPB.exe10,2 КБ (10 486 байт)
Автор: kalkin5
Дата сообщения: 14.09.2009 08:47
подскажите как сделать, мне надо чтобы в папке %windir%\mui\FALLBACK все папки кроме 0419 были удалены, попытался сделать сам, но что-то не работает


Код: for /f "delims=" %%a in (
'dir "%windir%\mui\FALLBACK" /b /s /a ^| findstr /i "lproj\>" ^| find /i /v "0419"') do rd /q /s "%%a"
Автор: 01MDM
Дата сообщения: 14.09.2009 09:17
kalkin5

Код:
@echo off
pushd "%windir%\mui\FALLBACK"
for /f "tokens=*" %%i in ('dir /b /ad ^| findstr /v "^0419$"') do rd /s /q "%%i"
popd

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: SAS.Планета (часть 2)


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