Алгоритм чтения командного файла в cmd.exe :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.09.23 14:38
Оценка: 133 (3)
У меня есть несколько тестовых виртуалок с разными версиями винды, включая XP, и для автоматизации работы в них используются командные файлы с хоста, вызываемые через shared folders. Давно заметил, что работа мало-мальски сложных командных файлов в виртуалках совершенно неадекватно тормозит. Например, десяток скриптов, вызывающих друг друга для настройки окружения и копирования нескольких файлов с хоста, может работать по полминуты и дольше. Пару раз порывался выяснить, отчего так тормозит, но обнаружилось, что везде тормозит равномерно, а разбираться глубже руки не доходили.

Сегодня вот, наконец, дошли — догадался последить за работой cmd.exe в Process Monitor. Увидел, что для чтения каждой строки скрипта он открывает файл, устанавливает текущую позицию, читает до 8191 символа (максимальная длина строки), затем закрывает файл. Внутри одной системы спасает кэширование, а для сетевых операций то ли винда, то ли поддержка shared folders, добавляют флаг запрета кэширования, и привет.

Теперь мучительно пытаюсь это развидеть, и заодно понять, в каком бреду можно было родить такой чудовищный алгоритм. Это не CRT — чтение в cmd.exe реализовано независимо. И так оно работает вплоть до последних версий Win 11, если что.
Re: Алгоритм чтения командного файла в cmd.exe :)
От: Pzz Россия https://github.com/alexpevzner
Дата: 04.09.23 15:40
Оценка: :))
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Теперь мучительно пытаюсь это развидеть, и заодно понять, в каком бреду можно было родить такой чудовищный алгоритм. Это не CRT — чтение в cmd.exe реализовано независимо. И так оно работает вплоть до последних версий Win 11, если что.


Наверное тот, кто это писал, держал в поле зрения тот факт, что в MS-DOS по умолчанию может быть всего 20 открытых файлов на всю систему. И не хорошо запущенным программам оставлять из них только 19...
Re: Алгоритм чтения командного файла в cmd.exe :)
От: reversecode google
Дата: 04.09.23 15:12
Оценка: :)
ищите ответ
https://github.com/Vichingo455/nt5src/tree/master/Source/XPSP1/NT/base/cmd
Re: Алгоритм чтения командного файла в cmd.exe :)
От: Философ Ад http://vk.com/id10256428
Дата: 04.09.23 15:44
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>...для чтения каждой строки скрипта он открывает файл, устанавливает текущую позицию, читает до 8191 символа (максимальная длина строки), затем закрывает файл.


ЕМ>Теперь мучительно пытаюсь это развидеть, и заодно понять, в каком бреду можно было родить такой чудовищный алгоритм. Это не CRT — чтение в cmd.exe реализовано независимо. И так оно работает вплоть до последних версий Win 11, если что.


Мне кажется это из MS DOS пришло. Там по дефолту files=8 — это значит, что одновременно может быть открыто только 8 файлов. Это очень мало. Я думаю именно поэтому оно каждый раз закрывает файл и заново его открывает.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[2]: Алгоритм чтения командного файла в cmd.exe :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.09.23 16:15
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Наверное тот, кто это писал, держал в поле зрения тот факт, что в MS-DOS


Господь с Вами, какой еще MS-DOS в интерпретаторе NT?
Re: Алгоритм чтения командного файла в cmd.exe :)
От: cserg  
Дата: 04.09.23 16:16
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Теперь мучительно пытаюсь это развидеть, и заодно понять, в каком бреду можно было родить такой чудовищный алгоритм.

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

ЕМ>Это не CRT — чтение в cmd.exe реализовано независимо.

Ответ есть среди ответов на SO:

The command interpreter remembers the line position byte offset it's at in the batch file. You will be fine as long as you modify the batch file after the current executing line position byte offset at the end of the most recently parsed line of code.

If you modify it before then it will start doing strange things (repeating commands etc..).

Re[2]: Алгоритм чтения командного файла в cmd.exe :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.09.23 16:21
Оценка:
Здравствуйте, cserg, Вы писали:

C>дает, например, возможность реализовать частично самомодифицируемые файлы скриптов.


Для ничтожной доли самомодифицирующихся скриптов логично было бы сделать спецрежим.
Re[3]: Алгоритм чтения командного файла в cmd.exe :)
От: Pzz Россия https://github.com/alexpevzner
Дата: 04.09.23 16:33
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

Pzz>>Наверное тот, кто это писал, держал в поле зрения тот факт, что в MS-DOS


ЕМ>Господь с Вами, какой еще MS-DOS в интерпретаторе NT?


Культура и стиль.
Re: Алгоритм чтения командного файла в cmd.exe :)
От: LaptevVV Россия  
Дата: 04.09.23 16:46
Оценка:
ЕМ>Теперь мучительно пытаюсь это развидеть, и заодно понять, в каком бреду можно было родить такой чудовищный алгоритм. Это не CRT — чтение в cmd.exe реализовано независимо. И так оно работает вплоть до последних версий Win 11, если что.
Индусы, вестимо...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.