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

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

Автор: Da_Neil
Дата сообщения: 13.11.2005 21:52
igor_andreev

Цитата:
Сильно performance у тебя с отключением коротких имен повысился? Скажешь - комп летает. Дык он и у меня летает, и еще у кучи народа, не трогающих NtfsDisable8dot3NameCreation в реестре.

Может, и мелочь, а душу всё равно греет. Не вижу причин, чтобы не отключать их, тем более меня не волнует совместимость с 16-разрядным старьём и батниками с ошибками.


Цитата:
Хоть ты кол на голове теши, а например "&" для комстроки - символ конца команды и начало следующей.

Да, я долго (в основном от незнания) боролся с этой гадостью в своём релизерском скрипте, но в итоге поборол. Кавычки, кавычки, и ещё 'аз кавычки, това'ищ!


Цитата:
И я согласен, и все согласны. И майкрософт так тоже решил и придумал язык с гораздо большими возможностями(VBScript). Ну их, эти батники...

Да, порою даже проще программу на VB.NET написать, чем с батниками мучиться..


Цитата:
Составной оператор - это что? А то я мало того, что не админ, еще и не программист Если внутри DO... имеешь ввиду, то REM точно работает, главное пустых строк не оставлять.

Да, это то, что внутри DO, да И правда, дело было в пустых строках! Ох уж эти недокументированные функции продуктов MS!
Автор: igor_andreev
Дата сообщения: 13.11.2005 22:29

Цитата:
Кавычки, кавычки, и ещё 'аз

И они не всегда спасают к сожалению . Из последнего, что делал - батник с enabledelaedexpansion упорно не хотел передавать на архивирование файлы, в названии которых есть восклицательный знак, бо считал это началом переменной. Ну не напрямую архиватору, заархивировать то такие файлы без проблем. Там сложную муть я придумал, сначала в файл *.ddf список для makecab.exe, потом создать *.sed и *.inf для iexpress.exe и т.д., много действий. Пришлось переписывать полностью, без enabledelaedexpansion
Автор: Da_Neil
Дата сообщения: 13.11.2005 23:34
Восклицательные знаки в блоках enabledelayedexpansion экранируются с помощью ^^ (кто бы мог подумать? )
Автор: igor_andreev
Дата сообщения: 13.11.2005 23:48
Da_Neil
Шапку пора в топике делать И там собирать недокументированные фичи от майкрософт, то, про что они во встроенной справке не пишут. Мнооого пунктов таких наберется.
Автор: Smitis
Дата сообщения: 14.11.2005 15:27
Da_Neil

Цитата:
Ещё заметил, что в составном операторе не работают ни обычные комментарии, ни нового типа ( :: )

Я бы не сказал, что это коментарии "нового типа". Более того, это вообще не коментарии. Это метки =) . То, что командный процессор не проверяет их синтаксис, а так, как на метку они не похожи, пропускает, не меняет смысла. Можно писать просто :любой текст. Если после двоеточия поставить любой недопустимый в метке символ, например, пробел, командный процессор всегда будет пропускать такие строки. Желающие могут считать это коментариями. Это, так - для информации.

А вообще, рекомендую читать хелп - ntcmds.chm
Например, в разделе "Основные понятия"/ "Общие сведения о командной оболочке" есть информация и о группировки команд (то, что в круглых скобках) и о символе ^ и о многом другом.

Единственное, что я не нашёл в этом хелпе - это операции с переменными среды замены и выделения подстроки типа %var:s1=s2% и %var:~n,m%

Автор: Da_Neil
Дата сообщения: 14.11.2005 15:44
Smitis
В книжке Microsoft Windows XP Inside Out Deluxe Edition вычитал :

Цитата:
Using the Rem command is the documented way to put comments in your batch programs, but it is intrusive because the command looks like part of the comment. Furthermore, if you leave echoing on while debugging a batch program, all your comments are echoed, making it harder to read commands. A better way to add comments to code is to use two colons:

:: This line is for humans; computers ignore it
This kind of comment is never echoed. Be sure to use two colons; using only one creates a label that might conflict with a legitimate label. Although this commenting style is handy, we use the conventional Rem statement in this book's examples to avoid confusing readers who miss this tip.



Цитата:
Например, в разделе "Основные понятия"/ "Общие сведения о командной оболочке" есть информация и о группировки команд (то, что в круглых скобках) и о символе ^ и о многом другом.

Там нет ни слова ни о разделении оператора ( ) на строки, ни про особенности delayedexpansion.. Всё методом тыка изучать приходится =/


Цитата:
Единственное, что я не нашёл в этом хелпе - это операции с переменными среды замены и выделения подстроки типа %var:s1=s2% и %var:~n,m%

Я бы тоже не прочь это найти..
Автор: KapralBel
Дата сообщения: 14.11.2005 15:53
Smitis


Цитата:
Единственное, что я не нашёл в этом хелпе - это операции с переменными среды замены и выделения подстроки типа %var:s1=s2% и %var:~n,m%

см. set /?
Автор: jeque
Дата сообщения: 14.11.2005 16:56

Цитата:
а почему бы просто не написать:
copy /y *.dbf *.cdx и_т_д папка_куда
На крайний случай несколько команд copy и xcopy?

Можно, но хочется, чтобы скрипт был универсальным.
А что если мне нужно будет еще что-то делать с этим набором файлов, к примеру архивировать? Там тоже придется перечислять все маски. А если нужно будет добавить несколько масок?
Так и запутаться недолго.
Автор: KapralBel
Дата сообщения: 15.11.2005 14:20
jeque
Robocopy <источник> <получатель> <маска1> <маска2>... <маскаN> </ключи>
такой финт ушами тебя устроит?
Автор: Smitis
Дата сообщения: 16.11.2005 09:44
KapralBel

Цитата:
см. set /?

Сдесь-то есть, отсюда и узнал. В справке - нет.

jeque

Цитата:
А что если мне нужно будет еще что-то делать с этим набором файлов, к примеру архивировать? Там тоже придется перечислять все маски. А если нужно будет добавить несколько масок? Так и запутаться недолго.

А использовать переменные:
set mask1=*.dbf *.cdx
set mask2=что_ещё.*
set fsrc=папка_откуда
set fdst=папка_куда
и так далее

Da_Neil
Насколько мне помнится, эти "коментарии" работали даже под ДОСом. Я рад, что в мелкософте тоже до этого додумались. Двойное двоеточие хорошо тем, что набирать быстро и с меткой никогда не совпадёт
А метод тыка - основной в иследовании возможностей командного процессора. Узнаёшь что-то новое - и сразу проверяешь во всевозможных вариантах, вдруг, что-то где-то не дописали. Например, использование символа ^
Автор: scup
Дата сообщения: 29.11.2005 12:00
Есть куча архивов в одной папке. Внутри архивов разные файлы, но с одинаковым названием. Например:
asdsd - архив, внутри файл test.dbf
xddss - архив, внутри файл test.dbf
Содержание файлов разное, только имена одинаковые.
Архивы формируются каждый день.

Задача: как извлечь архивы в определенную папку за определенный день (например, всегда за вчерашний от даты запуска батника), например, если седня вторник, извлекаем за понедельник, если за понедельник, то за пятницу (субботу, воскресенье пропускаем)
Автор: KapralBel
Дата сообщения: 29.11.2005 12:20
scup
А по какому принципу формируется имя архива?
Автор: scup
Дата сообщения: 29.11.2005 13:39
KapralBel Имя формируется случайным способои, закономерности нет, к чему можно привязаться, так это только к дате.
Автор: KapralBel
Дата сообщения: 29.11.2005 13:49
scup

Цитата:
Имя формируется случайным способои

Это зря....
Тогда только через VBS/JS.



Добавлено:
scup
Немного погорячился...
Все зависит от установленной у тебя системы
* Если Win2000/XP/2003 - то возможно
* Если Win9x/ME - то без JS/VBS не обойтись
Автор: scup
Дата сообщения: 29.11.2005 16:32
KapralBel Угу WinXP, как реализовать?
Автор: KapralBel
Дата сообщения: 29.11.2005 16:44
scup
Сейчас сам батник не напишу (скоро ухожу и буду дня через 2), но идеи подсказать смогу
1. Список архивов dir >list.txt
2. Разбор текста при помощи команды FOR /? - получишь имена архивов и даты соответсвующие им
3. далее сравнение дат и распаковка архива
см. команды

FOR /?
SET /?
IF /?


PS. Геморрой еще тот - лучше сделай имена архивов типа <ГГГГММДД-Пояснение>
Автор: igor_andreev
Дата сообщения: 29.11.2005 18:11
scup
Два последних файла находятся так

Код:

@ECHO OFF
FOR /F "DELIMS=" %%A IN ('DIR /O:-D /A:-D /B "e:\backup\*.rar"') DO (
IF DEFINED ARC_1 IF NOT DEFINED ARC_2 SET ARC_2=%%A
IF NOT DEFINED ARC_1 SET ARC_1=%%A
)

ECHO %ARC_1%
ECHO %ARC_2%

PAUSE

Автор: scup
Дата сообщения: 05.12.2005 11:52

Цитата:
Единственное, что я не нашёл в этом хелпе - это операции с переменными среды замены и выделения подстроки типа %var:s1=s2% и %var:~n,m%


Да, хотелось бы услышать или почитать об этом, а то эти замены мне ни очем не говорят, особенно с восклицательными знаками. Кто-то может ликбез провести?

и еще:
FOR /F "DELIMS=" %%A IN ('DATE /T') do SET A = %%AR
DATE 01.01.1994
PAUSE

как дальше вернуть дату на компе, сохраненную в переменной?
Автор: KapralBel
Дата сообщения: 05.12.2005 12:10
scup
У меня прошел следующий финт ушами..
Echo %a%|Date
Автор: scup
Дата сообщения: 05.12.2005 13:57
KapralBel А у меня не прошел. Батник у тебя сохранил текущую дату, изменил дату и вернул сохраненную дату? Дай весь код.
Автор: KapralBel
Дата сообщения: 05.12.2005 14:13
scup
Какое у тебя храниться значение в переменной с датой
пн, 05/12/2005?
05/12/2005?
Первый случай неверный...

Добавлено:
scup

Код:
@Echo On
FOR /F "DELIMS=" %%A IN ('DATE /T') do SET OldDate=%%A
Date 1/12/2005
Echo %OldDate% | Date
Автор: Smitis
Дата сообщения: 05.12.2005 22:47

Цитата:
Шапку пора в топике делать И там собирать недокументированные фичи от майкрософт, то, про что они во встроенной справке не пишут. Мнооого пунктов таких наберется.

Уже парочка есть. Вот только с делами разберусь, отредактирую и "запостю". А в шапке можно линки давать на посты.

scup

Цитата:
Да, хотелось бы услышать или почитать об этом, а то эти замены мне ни очем не говорят, особенно с восклицательными знаками. Кто-то может ликбез провести?

Как уже писал KapralBel: set /? Больше в "официальной литературе" поэтому поводу ничего нет.
А ликбез можно попробывать провести. Чуток времени свободного только будет. Только я не понял, что за "замены с восклицательными знаками"?


Добавлено:
KapralBel

Цитата:
Echo %OldDate% | Date

А почему не просто date %olddate% ?
Автор: Iacoyn
Дата сообщения: 06.12.2005 00:31
Люди добрые, помогите коллективным разумом! Есть задача в папке WINDOWS после установки апдейтов создаются подпапки типа $NT...$ с которыми комманды cmd.exe работать отказываются - как их на автомате удалять? del не срабатывает ни на $*$ ни $$*$$, в чём я не прав?
Немного неправильно задал вопрос - DIR и прочие не выдают файлов и папок в списке если их имена начинаются с $ - как получить их список для последующего удаления?
Автор: Smitis
Дата сообщения: 06.12.2005 01:17
Iacoyn
Сейчас посмотреть негде, но там вроде атрибуты на папках стоят, системный, скрытый, только для чтения.
Посмотреть все файлы, не взирая на атрибуты, можно командой DIR /a
Папки удаляются командой RD, причём маска не поддерживается.
Для перечисления - FOR
В общем
Код:
for /f "delims=/" %d in ('dir /b /ad $*$') do @rd /s/q %d
Автор: scup
Дата сообщения: 06.12.2005 08:17

Цитата:
А почему не просто date %olddate%
Smitis Не поверишь, вчера перед тем как задавать вопрос использовал такую конструкцию, выдавалась ошибка "неверная дата, введите новую дату". Способ KapralBel заработал. Седня попробовал date %olddate% - тоже получилось.

Цитата:
Только я не понял, что за "замены с восклицательными знаками"?
Я имел ввиду, что иногда используют переменные %СС%, а иногда !СС!. igor_andreev что-то там чуть-чуть обьяснял 2 страницы назад, но очень мало, когда их использовать?


Автор: Smitis
Дата сообщения: 06.12.2005 09:10
scup

Цитата:
когда их использовать

В скобках!
Несколько команд/строк можно объеденить в "одну", заключив их в скобки. Типа {} с языках С, джаве. Используется чтобы создать "структурные" IF и FOR (можно, конечно, и другое применение найти).
Пример
Код:
@echo off
set aaa=111
if h == h (
set aaa=222
echo %aaa%
)
echo %aaa%
Автор: KapralBel
Дата сообщения: 06.12.2005 09:40
scup

Цитата:
Smitis Не поверишь, вчера перед тем как задавать вопрос использовал такую конструкцию, выдавалась ошибка "неверная дата, введите новую дату". Способ KapralBel заработал. Седня попробовал date %olddate% - тоже получилось.

Могу сказать почему

Цитата:
FOR /F "DELIMS=" %%A IN ('DATE /T') do SET OldDate=%%A


Цитата:
FOR /F "DELIMS=" %%A IN ('DATE /T') do SET OldDate = %%A

Во втором случае видишь пробелы вокруг равно? Вот они и мешают

Smitis

Цитата:
date %olddate%
- можно и так
Автор: scup
Дата сообщения: 09.12.2005 08:42
мою задачу, которая успешно решена с вашей помощью нужно немного изменить решение, надеюсь на вашу помощь. Итак:

01.01.2005
a
s
d
f
s
02.04.2005
d
f
g
d
03.05.2005
a
s
d
s
a

вывести только даты и строки, начинающиеся на а, но если под датой нет строки, начинающейся на а, то дату выводить не надо.


Автор: Da_Neil
Дата сообщения: 10.12.2005 23:13
Задача: запустить скрытый (т.е. полностью спрятать интерфейс) процесс с низким приоритетом с параметрами, переданными скрипту, и оставаться запущенным до его завершения.
Отдельны части задачи реализуется либо с помощью командного процессора, либо с помощью WSH. А вот всё вместе.. Без программирования что-нибудь получится сделать? Если нет, то нет ли у кого исходников нечто похожего на языках .NET?
Автор: vito333
Дата сообщения: 12.12.2005 06:39
Программа для создания самораспаковывающихся архивов, распаковывающихся
при помощи недокументированных функций OS.
Работает только под NT системами.
Коэффициент сжатия весьма невелик, намного уступая даже обычному zip (вдвое RAR-у), но скорость упаковки-распаковки практически мгновенная. Те же функции, что использует NTFS.
Работает как из ком строки, так и через GUI. Размер ~4kb.

http://vito.rbcmail.ru/Misc/NtPak.zip

может кому пригодится

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879

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


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