Как предотвратить изменение команды / скрипта в глобальной среде - PullRequest
1 голос
/ 31 мая 2010

Мне нужно запустить скрипт-блоки / скрипты из текущей оболочки верхнего уровня, и я хочу, чтобы они оставили глобальную область без изменений.

До сих пор я мог думать только о следующих возможностях:

 powershell -file <script>
 powershell -noprofile -command <scriptblock>

Проблема в том, что они очень медленные.

Например, я хотел бы иметь возможность:

mkdir newdir
cd newdir
$env:NEW_VAR = 100
ni -item f 'newfile.txt'

... так что рабочий каталог моей оболочки не изменится и $env:NEW_VAR не будет установлен в глобальной области видимости.

Есть ли еще альтернативы для достижения этой цели?

Ответы [ 2 ]

2 голосов
/ 31 мая 2010

Я не знаю ни о какой другой альтернативе. Переменные окружения сохраняются для каждого процесса, как ответил @Peter.

Кроме того, если вы создадите новый каталог и файл там, то вы измените глобальную среду. Так что сценарий не совсем невиновен.

В вашем случае я бы запустил новый процесс, как вы предложили.
Если он слишком ленив, поместите его в скрипт и оберните в try / finally:

--- script.ps1
push-location
try {
  mkdir newdir
  cd newdir
  $env:NEW_VAR = 100
  ni -item f 'newfile.txt'
} finally {
  pop-location
  # delete dir/file?
  remove-item env:NEW_VAR
}
1 голос
/ 31 мая 2010

Нет такой вещи как глобальная среда. При порождении нового процесса ОС создает копию среды для нового процесса.

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

...