- Текущую рабочую директорию
- Системную директорию Windows (путь к ней можно получить функцией GetSystemDirectory())
- Директорию Windows (путь к ней можно получить функцией GetWindowsDirectory())
- Директории перечисленные в переменной окружения PATH
Если имя не содержит расширения (например, notepad или attrib), Windows будет запрашивать список файлов удовлетворяющих шаблону "имя.*" в каждой директории поиска чтобы найти файл с расширением упомянутым в переменной окружения PATHEXT.
Всё в порядке, если необходимо просто запустить notepad или mspaint из командной строки. Но что, если программу необходимо запускать много раз подряд? Тогда обращаться к ней по имени, определённо, не самое удачное решение. Далее я постараюсь объяснить почему.
Во-первых, одна или несколько директорий поиска могут содержать очень много файлов (30000 файлов, например). Во-вторых, одна или несколько директорий поиска могут иметь большое время доступа (расположены на сетевой папке, например). При выполнении обоих пунктов, Windows будет тратить огромное количество времени только на поиск исполняемого файла.
Вот простой пример. Напишем маленький файл dotestiter.bat и положим его в C:\Windows\System32 directory\ (которая входит в состав директорий поиска):
@dir /B %1К этому файлу можно обращаться как по имени (dotestiter) так и по его полному пути (C:\Windows\System32\dotestiter.bat).
Этот файл будет вызываться из файла dotest_name.bat:
@for /R %%e in (*) do dotestiter "%%e"И из файла dotest_full.bat file:
@for /R %%e in (*) do C:\WINDOWS\system32\dotestiter.bat "%%e"Оба файла будут вызывать dotestiter.bat для каждого файла в текущей рабочей директории (которая также входит в состав директорий поиска).
Результаты для сетевой папки с 250 файлами (я подсоединил сетевую папку как Z: с помощью net use чтобы использовать её из командной строки):
- dotest_name.bat - 34.6 секунд
- dotest_full.bat - 24.3 секунд
p.s. Подобную ситуацию тяжело воспроизвести в *nix так как в них оболочка не ищет программы запускаемые по имени в текущей рабочей директории.
Комментариев нет:
Отправить комментарий