Удивительные батники

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

Модератор: tyomitch

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Удивительные батники

Сообщение tyomitch » 11.04.2006 (Вт) 7:46

В качестве преамбулы про малоизвестные возможности cmd.exe: до сих пор некоторые не знают, что он поддерживает автодополнение, и пишут для этого какие-то свои навороты. И это при том, что автодополнение описано в справке, выводимой по команде cmd /?. Но кто же читает справку?

* Есть такая малоизвестная команда DOS -- for. В WinNT её наделили интересной возможностью чтения вывода других команд -- причём более мощной и гибкой, чем оператор `` традиционных *никсовых скриптов. Естественно, об этой возможности сообщает команда for /?, но кто же читает справку?

* Чтобы узнать текущую папку, не нужно изобретать аналог команды cwd=`pwd`. (Кстати, на той странице опечатка: их код следует читать как for /f "delims=" %%i in ('cd') do set cwd=%%i).

Есть способ куда проще: set cwd=%cd%.

Команда set /? выдаёт полную справку о специальных переменных окружения; кроме %cd%, есть ещё шесть других. Но кто же читает справку?

* Команда call поддерживает вызов подпрограмм и передачу им аргументов. Кроме этой возможности, в справке, выводимой по команде call /?, описаны модификаторы аргументов вида %~1; например, батник echo %~p0 выведет свой путь (без названия диска и имени файла).

Но кто же читает справку? В том самом батнике, который мне пришлось переделывать в шелл-скрипт, автор решил реализовать вызов подпрограмм более хитро:

Код: Выделить всё
if .%1==.sub goto %1%2
...
for %%a in (*.red) do call %0 sub 1 %%a
...
goto end
:sub1
for %%b in (*.red) do call %0 sub 2 %3 %%b
goto end
:sub2
...

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

* И в завершение -- 90-байтный whereis(1) от Чена. Этот крохотный батник принимает имя команды (без расширения), и находит в PATH соответствующий ей исполнимый файл:
Код: Выделить всё
@for %%e in (%PATHEXT%) do @for %%i in (%1%%e) do @if NOT "%%~$PATH:i"=="" echo %%~$PATH:i


И зачем нам при всём этом ещё какая-то Монада?
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Удивительные батники

Сообщение Sebas » 11.04.2006 (Вт) 8:03

tyomitch писал(а):И зачем нам при всём этом ещё какая-то Монада?


Учитывая ЕЁ синтаксис :cry:

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

sebas<-@->mail.ru

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 11.04.2006 (Вт) 8:05

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


Вернуться в Tyomitch

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList  
cron