Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/42: Рейтинг темы: голосов - 42, средняя оценка - 4.95
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

[Статья] Дело о заблокированной переменной окружения %PATH%

28.02.2018, 23:32. Показов 9240. Ответов 1

Студворк — интернет-сервис помощи студентам
Название: computer_failure.jpg
Просмотров: 108

Размер: 32.2 Кб


Дело о заблокированной переменной окружения %PATH%.
Автор: Dragokas

Как-то раз мне потребовалось отсканировать документ, но при попытке открыть интерфейс сканера появилась ошибка:

Название: 1.jpg
Просмотров: 108

Размер: 9.9 Кб

Согласно одному из советов на официальном сайте было предложено добавить папку с библиотеками сканера в переменную PATH, что я и сделал по своей же инструкции:
  1. Скопировал в буфер обмена нужный путь (у меня это «C:Windowstwain_32CNQL25», без кавычек)
  2. Открыл оснастку «Система» быстрой комбинацией Win + R
  3. Нажал слева «Дополнительные параметры» => «Переменные среды»
  4. В группе «Системные переменные» нашел переменную PATH, «Изменить»
  5. Поставил курсор в конец строки с полем «Значение переменной» и убедился, что в конце строки есть знак «точка с запятой»
  6. И нажал «Вставить из буфера» по ПКМ.


Название: failure.jpg
Просмотров: 108

Размер: 3.9 Кб
Но ничего не вставилось, а в колонках раздался радостный звук «Дзыньк» =)))

Название: Mozg.png
Просмотров: 108

Размер: 2.9 Кб
Первая мысль – в буфер обмена ничего не скопировалось (хотя в этом случае пункт «Вставить» должен был быть серым).
Ну да ладно, гадать не буду, и решил просто вручную набрать путь с клавиатуры.
Но не тут-то было.
В ответ всё те же радостные звуки «Дзыньк-дзыньк».

Название: Mozg.png
Просмотров: 108

Размер: 2.9 Кб
Неисправна клавиатура?

Да нет же, проверил в блокноте, всё нормально набирается.
Что же делать?

1. Способ дилетанта

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

PATH – это особая переменная, которая собирается из двух параметров PATH в ключах реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\Session Manager\Environment
HKEY_CURRENT_USER\Environment (по-умолчанию, здесь параметра PATH нет).
Учитывая, что у меня на полочке лежит недописанная статья о переменных окружения, было нетрудно «вспомнить» этот путь, перейти туда, открыв «Редактор реестра» (Win + R, regedit), и отредактировать значение параметра PATH.



OK, перезагрузка, и ошибка со сканером пропала.

Отступление от темы статьи:
… хотя появилась другая ошибка, что якобы TWAIN используется другим устройством.
Дальше была переустановка драйвера сканера с удалением уст-ва через «Панель управления». Но это тоже не помогло. В общем, в итоге я всё-таки отсканировал документ, подцепив USB-сканер через виртуальную машину с Windows XP непосредственно в момент установки драйвера (кстати, виртуалка с Win7, почему-то отказалась его увидеть).


Кликните здесь для просмотра всего текста
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2018, 23:32
Ответы с готовыми решениями:

Парсинг переменной окружения PATH
Доброго времени суток. Дали задачу реализовать алгоритм поиска исполняемых файлов в CMD. Мне нужно парсить переменную PATH. Прикрепленный...

Переменная окружения PATH
Зачем нужна переменная PATH?

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

1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
28.02.2018, 23:48  [ТС]
2. Способ рядового исследователя

И вот, наконец, появилось время разобраться, что же происходит с PATH.

Название: Mozg.png
Просмотров: 109

Размер: 2.9 Кб
Новая мысль – заблокированы права (политики? список контроля доступа (DACL) ? ).

О политиках я не слышал, чтобы была такая, контролирующая PATH (но не исключаю).
А на счёт списка прав – они назначаются только на весь ключ реестра, а не на конкретный параметр (в нашем случае переменную). Т.е., если заблокирована PATH, то тоже самое должно происходить и со всеми соседними переменными.

Проверим?

Эксперимент.
Возьму первую попавшуюся – переменную «OS».
Пробую – и бац, в оснастке «Переменные среды» её значение легко поменялось.

Так-то. Давайте подойдём с другой стороны:

Название: Mozg.png
Просмотров: 109

Размер: 2.9 Кб
а что на счёт консоли?

Командная строка CMD (Win + R, cmd) позволяет также менять значение PATH, но это работает только в границах сессии консоли, а не на всю систему.

Там даже есть отдельная внутренняя команда Path. Но мы обойдёмся без неё.
Добавим для теста наш путь командой:

Code
1
set Path=%Path%;C:\Windows\twain_32\CNQL25


Получили «Отказано в доступе».
Любопытно.

Всё таки: проблемы в правах?

А что если просто распечатать содержимое?


Вот так новость. Я её даже не могу распечатать!

Попробуем с правами администратора?

Именем святого Админа, запускаем командную строку:



Нет, всё же, не везёт нам.

Название: Mozg.png
Просмотров: 109

Размер: 2.9 Кб
Может дело просто в каких-то спецсимволах в путях? Ком. строка очень не любит всякие птички ^, скобки и прочее.

Давайте заключим содержимое в кавычки:



Вуаля

И даже работает присвоение:
Code
1
set "Path=%Path%;C:\Windows\twain_32\CNQL25"
Хорошо. Но в чём именно проблема?
Я скопировал в блокнот всё значение (взял из реестра).
И методом половинного деления начал подставлять эту строку в echo.

В итоге выяснилось, что где-то в средину пути попала такая штука:



Символ перенаправления строки в файл >.
В итоге, вместо того, чтобы распечатать строку на экран консоли, она пыталась вывести её в файл C:\Windows\System32;C:\Windows;C:\Wi… не являющийся корректным именем. Из-за чего и возникала ошибка «Отказано в доступе»

А что же на счёт системы?
> - это недопустимый символ для пути. Получается, всё это время система «глючила» из-за него?

Открыв редактор реестра, я удалил знак > из параметра PATH.
(заодно заметив, что у меня 2 раза повторяются все пути, но пока решил это не трогать).

ОК, ещё раз захожу в оснастку «Система» в «переменные окружения», пытаюсь изменить значение PATH, и … снова не получается.
Но тут всё понятно:

Название: article.jpg
Просмотров: 108

Размер: 3.4 Кб
Известно, что каждый процесс хранит в памяти блок переменных окружения, и не изменяет его, пока система не отправит специальное сообщение. И даже в этом случае процесс не обязан обновить переменные.

Так что мы просто перезапустим процесс explorer, который отвечает за загрузку окон оснасток (напомню, это можно сделать через Ctrl + Shift + ПКМ по окну в меню «Пуск»).



Или, что более надёжно, перезагрузим всю систему.

Вот уже появились ярлычки. Захожу, проверяю, и …



Каково было удивление, но ничего не сработало. Символы опять не печатаются в поле «Значение переменной». ))))

Название: Mozg.png
Просмотров: 109

Размер: 2.9 Кб
Но не отчаиваемся. Остался один очевидный факт:
1) Два раза дублируются пути
2) Строка с содержимым Path какая-то уж слишком длинная
3) Заметил, что в поле «Значение переменной» хоть и нельзя печатать, но можно удалять символы.

Итак, ограничение по длине?

Но, какого рода лимит?
Может, предел для длины значения параметра реестра?
Открываем базу знаний Micosoft: Registry Elements Size Limits.

Там говорят:
Value name
16,383 characters
Windows 2000: 260 ANSI characters or 16,383 Unicode characters.
А наша строка = 2271 символов.
Пишут, что в Win2k был жесткий лимит – в 260, но это только для ANSI-версий API-функций, а внутренне – строки хранятся в реестре все равно в Unicode. Точнее, в смешанном виде ANSI + Unicode (механизм оптимизации, детальнее о котором писал Руссинович в «Windows Internals»). Да и у меня под руками Windows 7, так что не вариант.

Эксперимент.
Поскольку оснастка даёт нам право удалять символы, а давайте так и сделаем.
Будем удалять их до тех пор, пока текстовое поле не позволит нам вводить новые символы.



И… ура, сработало

После нескольких десятков удалённых, нам позволили наконец-то вводить новые символы (не пришлось даже нажимать кнопку «ОК»).

Давайте же замерим, сколько получилось в итоге максимальное число символов.

Мой любимый AkelPad показывает что их – 2047.
Вот как. И что же за магическое число 2047 ?

Спросим у великого гуру – Google: «Path limit 2047»
Первая же ссылка ведёт на довольно любопытную статью от Karthiyayini C. (из Intel): Limitation to the length of the System PATH variable.

В ней даётся таблица с симптомами «переполнения» переменной PATH, когда её длина >= 2048 символов:
Размер PATHWindows XP, Windows Server 2003Windows 7, Windows 8, Windows Server 2008
< 2048 байтовВсё работает прекрасноВсё работает прекрасно
>= 2048 и  
< 4096 байтов1. PATH пустой в командной строке (echo %PATH%)1.PATH пустой в командной строке (echo %PATH%)
  2. Нельзя запустить приложение из-под командной строки без указания полного пути (notepad.exe)2. Нельзя запустить приложение из-под командной строки без указания полного пути (notepad.exe)
  3. Можно запустить приложение из-под командной строки, указав полный путь (c:\windows\system32\notepad.exe) 3. Можно запустить приложение из-под командной строки, указав полный путь (c:\windows\system32\notepad.exe)
  4. Windows Explorer работает прекрасно 4. Windows Explorer работает прекрасно
  5. Можно запустить “Панель Управления\Система\Дополнительные параметры системы”5. Невозможно запустить “Панель Управления\Система\Дополнительные параметры системы”
  6. Можно получить “Дополнительные параметры системы” из-под командной строки %WinDir%\System32\SystemPropertiesAdvanced.exe 6. Можно получить “Дополнительные параметры системы” из-под командной строки %WinDir%\System32\SystemPropertiesAdvanced.exe
  7. “Дополнительные параметры системы” могут отобразить все переменные окружения, включая PATH7. Дополнительные параметры системы” могут отобразить все переменные окружения, включая PATH
  8. После перезапуска системы, PATH больше не пустая, но обрезана до 2048 символов8. После перезапуска системы PATH больше не пустая и ведёт себя нормально
>= 4096 байтовпп. 1, 2, 3, 4, 5 и 6 так же, как вышепп. 1, 2, 3, 4, 5 и 6 так же, как выше
 “Дополнительные параметры системы” не отображают большинство переменных окружения, включая PATH“Дополнительные параметры системы” не отображают большинство переменных окружения, включая PATH
 После перезапуска системы, PATH больше не пустая, но обрезана до 2048 символовПосле перезапуска системы, PATH больше не пустая, но обрезана до 4096 символов

Решение проблемы даётся тоже весьма любопытное: перезагрузить систему, и она сама обрежет переменную до максимально допустимого размера.

Этого я, честно говоря, не наблюдал у себя, как и отказ системы запустить блокнот без указания полного пути. Но я особо и не пытался повторить эксперимент Intel. Может, у вас, читатели, это получится.
Заодно, и обратите внимание, что согласно статье Intel превышение длины значения PATH (больше 2047, и более серьёзные последствия, если больше 4095 символов) может привести к таким проблемам, как сбои в работе оснастки «Дополнительные параметры системы», а также других программ, зависящих от корректной работы этой переменной, т.к. значение обрезается.

Название: check.jpg
Просмотров: 107

Размер: 6.6 Кб

Итог и решение проблемы.
Для однозначного решения проблемы остаётся второй вариант (также предложенный и в статье от Intel) – это обрезать значение самому.

После удаления лишних путей в строке PATH и приведения её длины до приемлемых размеров (меньше 2048 символов) я записал это значение через «Редактор реестра» в параметр PATH ключа HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\Session Manager\Environment.

Проблема решена.
А сегодня мой сканер работает нормально даже в моей основной системе. Уж не знаю, связана ли его проблема была с PATH или нет. Но лично я доволен.
А моя статья надеюсь, ещё принесёт кому-то пользу, как и увлекательный рассказ о процессе поиска виновника, который может сподвигнуть вас на использование похожих методов при поиске и решении других видов неисправностей.

Всем удачи!


Использованы материалы:

1. MSDN. Registry Elements Size Limits.
2. Karthiyayini C. (Intel). Limitation to the length of the System PATH variable.
3. remontka.pro - Как перезапустить Проводник explorer.exe в два клика
4. Мозг ^_^

Кликните здесь для просмотра всего текста
6
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.02.2018, 23:48
Помогаю со студенческими работами здесь

Слетели переменные окружения PATH
Всем доброго времени суток. Собственно у меня полностью слетели переменные окружения и Builder XE не работает в режиме дебага...

Добавить указанные в командной строке каталоги в переменную окружения PATH
Добрый день. Вторая задача: &quot;Напишите пакетный командный файл, добавляющий указанные в командной строке каталоги в переменную...

Изменение переменной окружения
Как через функцию RegSetValueEx поменять переменную среды PATH на &quot;С:\&quot; (нужно менять именно из кода программы)

ПРоблема переменной окружения
При удалении програмы в ОС Федора ошибка. &quot;This application requires a Java Run Time Environment (JRE) to run. Searching...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru