Power Shell не может перезаписать постоянную ошибку после запуска сценария во второй раз? - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть скрипт PowerShell с константами, определенными внутри скрипта:

Set-Variable MY_CONST -option Constant -value 123

Write-Host "Hello, World!"
Write-Host $MY_CONST

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

Set-Variable : Cannot overwrite variable MY_CONST because it is read-only or constant.

Я работаю внутри Visual Studio Code 2017. Если я закрою и повторно открою код Visual Studio, он будет работать, если вы запустите его снова (иво второй раз после этого ...).

1 Ответ

0 голосов
/ 15 декабря 2018

Если вы используете -Option Constant, вы говорите PowerShell, что результирующая переменная не должна разрешать последующее изменение .

Следовательно, повторный запуск Set-Variable с тем же именем переменной приводит кв ошибке.

При этом, , вы увидите этот симптом только в том случае, если ваш сценарий имеет «точечный источник», т. е. выполняется непосредственно в области действия вызывающего , что означает, что повторные вызовы видятопределения, оставленные предыдущими вызовами.

В некоторых средах неявно выполняют "точечный источник" - в частности, PowerShell ISE и - как в вашем случае - код Visual Studio с расширением PowerShell.

Простой обходной путь - добавить -ErrorAction Ignore к вашему вызову Set-Variable, учитывая, что справедливо предположить, что единственной возможной причиной сбоя является переопределение константы.


  • В целом, в таких средах, как PowerShell ISE и Visual Studio Code , следует помнить, что данный сценарийВ результате вызова могут остаться определения, которые влияют на последующие вызовы.

  • В отличие от этого, не вызывает беспокойство при повторном вызове сценария из консоли PowerShell / терминал окно , потому что сценарии там выполняются в дочерней области.


mhhollomon запрашивает использование Модификаторы области , такие как $script:..., будут работать:

Нет, потому что в глобальной области, в которой сценарии выполняются в коде Visual Studio, область действия $script:... (Set-Variable -Scope Script ...)является такой же областью действия, т. е. также глобальной областью действия.

Если вы действительно хотите явно убедиться, что ваш скрипт не изменяет вызывающую область, даже если она имеет "точечный источник", выможет обернуть все содержимое скрипта в & { ... }, чтобы обеспечить выполнение в дочерней области.

...