Может кто-нибудь объяснить, когда / почему необходимо перезапустить приглашение Powershell и / или cmd (если они ведут себя по-другому в этом вопросе)?

Например, для работы с самым современным состоянием компьютера я должен перезапустить Powershell после:

1) Редактирование системной переменной среды, такой как Path

2) Установка таких вещей, как модули npm

3) Редактирование файла, такого как .txt или файла в проекте VSCode

Заранее спасибо!

2 ответа2

1

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

Как CMD, так и Powershell при запуске читают переменные среды пользователя / системы и применяют их к текущей оболочке. Когда вы вносите изменения в значения, такие как PATH, из этой оболочки, вы просто обновляете значения по умолчанию, используемые любыми новыми оболочками (CMD или POSH), и, как правило, не меняете текущую среду оболочек.

Такие вещи, как PATH, могут быть изменены в текущей оболочке, но в CMD и POSH это делается иначе. Вот простая демонстрация, которая показывает это в действии с командной строкой.

Откройте приглашение CMD и выполните эти команды для настройки демо:

C:\>mkdir c:\pathtest
C:\>echo @echo hello > c:\pathtest\sayhello.cmd

если вы переключитесь в c:\pathtest и выполните sayhello , он должен работать как положено и вывести "hello" на экран:

C:\>cd c:\pathtest
C:\pathtest>sayhello
hello

Теперь вернитесь в корневой каталог и снова запустите sayhello и вы получите команду « Распознанная ошибка»:

C:\pathtest>cd ..
C:\>sayhello
'sayhello' is not recognized as an internal or external command,
operable program or batch file.

Теперь волшебство, приведенное ниже, обновляет PATH вашей текущей оболочки (только), включая c:\pathtest , и позволяет вам запускать sayhello из любого места.

C:\>SET PATH=%PATH%;c:\pathtest
C:\>sayhello
hello

Закройте приглашение CMD и откройте новое, и инструкция PATH вернулась к своему первоначальному значению, и sayhello больше не будет работать. (вы также можете удалить c:\pathtest сейчас).

То же самое относится и к Powershell - вы можете манипулировать встроенной переменной $ env, чтобы изменить PATH и т.д. Только для текущего сеанса.

Итак, вернемся к вашим первоначальным вопросам:

Например, для работы с самым современным состоянием компьютера я должен перезапустить Powershell после:

1) Редактирование системной переменной среды, такой как Path

2) Установка таких вещей, как модули npm

3) Редактирование файла, такого как .txt или файла в проекте VSCode

  1. Если изменяются переменные среды (например, установка чего-то, что изменяет PATH), перезапуск оболочки - самое простое исправление, но, как описано выше, вы можете обойти это, если знаете, что было сделано, и вручную примените его к текущей оболочке.

  2. Модули npm располагаются в файловой системе, поэтому, если они не изменяют PATH или что-либо подобное, вам не нужно перезагружать оболочку, чтобы увидеть изменения.

  3. Как и выше, когда вы нажимаете сохранить в редакторе, эти данные записываются на диск. Когда вы выполняете POSH/CMD, он читается с диска интерпретатором во время выполнения.

1

Процесс, который прослушивает сообщение окна WM_SETTINGCHANGE, сможет обновлять текущие переменные среды без перезапуска.

Я думаю, что игнорирование WM_SETTINGCHANGE от Powershell и CMD является намеренным, чтобы гарантировать, что переменные среды не могут быть изменены во время выполнения скрипта.

Больше информации:
Переменные среды
Перезапуск Windows для обновления переменных среды локальной системы

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .