Среда сценария влияет на родительскую оболочку - PullRequest
3 голосов
/ 07 июля 2019

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

script.ps1

[cultureinfo]::currentculture = [cultureinfo]::InvariantCulture
Set-PSDebug -Trace 1
> [cultureinfo]::currentculture

LCID             Name             DisplayName
----             ----             -----------
1031             de-DE            Deutsch (Deutschland)

> .\script.ps1
> [cultureinfo]::currentculture
DEBUG:    1+  >>>> [cultureinfo]::currentculture

LCID             Name             DisplayName
----             ----             -----------
127                               Unveränderliche Sprache (Unveränderliches Land bzw. unveränderliche Region)

Поэтому очевидно, что трассировка отладки активна и культурные изменения сохраняются ...

1 Ответ

4 голосов
/ 07 июля 2019

С документы для [cultureinfo]::currentculture] (выделение добавлено):

Получает или задает объект CultureInfo, представляющий культуру , используемую текущим потоком .

Таким образом, изменение по конструкции вступает в силу для всего потока, а не только для вашего сценария, и сохраняется в течение всего времени существования потока (после выхода из сценария) или до тех пор, пока вы не измените его снова.

Поэтому, если вы хотите, чтобы ваша культура изменилась на в области , вы должны вручную :

  • заранее сохранить текущую культуру
  • восстановить эту культуру позже.

Предупреждение :

  • В Windows PowerShell ,Культура автоматически сбрасывается до значения запуска , но только в командной строке после каждого вызова команды или сценария;напротив, если один сценарий вызывает другой, и вызываемый объект изменяет текущую культуру, это изменение остается в силе для вызывающего сценария.

  • В отличие от этого, PowerShell Core ведет себяи никогда не сбрасывает текущую культуру автоматически.


Обратите внимание, что поведение аналогично использованию Set-Location (cd) для изменения текущего местоположения (каталога), что также влияет на весь поток, как это происходитв cmd.exe пакетном файле (кроме случаев, когда вы используете setlocal), но, например, не в сценарии Bash.

В PowerShell файлы сценариев (*.ps1) запустить в процессе , как и пакетные файлы (*.cmd, *.bat) в cmd.exe, тогда как POSIX-подобные оболочки, такие как сценарии Bash, запускаются в дочернем элементе процесс , который неявно и неизменно ограничивает изменения среды такими сценариями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...