2016-12-20 6 views
5

Выполнение кода $? = $true в powershell приводит к сбою программы с сообщением об ошибке «powershell перестало работать».

Некоторые встроенные функции, такие как $true или $host ошибка: Cannot overwrite variable true because it is read-only or constant.. Другие, такие как $myinvocation или $null, просто игнорируются. Почему $? отличается? Есть ли документация, на которой у встроенных есть ответ? help about_automatic_variables не имеет информации.

Я в настоящее время работаю версия 5.1. Я также попытался использовать powershell -version $n '$? = $true' и версии 3-5 всех сбоев. Интересно, что версии 1 и 2 этого не делают; они вызывают ошибку переменной только для чтения.

+3

Вы хотите разборки кода, который демонстрирует, почему он сбой, или вы хотите знать, должно ли оно это делать? Ответ на последний - это нет. Глупая ошибка - ошибка. PowerShell 3 был существенным новым выпуском, который перешел PowerShell в динамический язык Runtime; вместе с ним изменилась куча поведения. Некоторые полезные, некоторые удивительные, и некоторые просто багги. Это, по-видимому, один из последних. –

+0

Мне было интересно, было ли это намеренно/задокументировано. Интересно о версии 3 и DLR, о которых я раньше не слышал. Есть ли где-нибудь отправить отчет об ошибке или я просто не буду беспокоиться об этом? –

+0

Странно. PSVersion 5.0.10586.117 throws 'Не могу перезаписать переменную? потому что он доступен только для чтения или постоянным. ' –

ответ

4

Похоже, это known bug. Исправление было добавлено к версии, которая в настоящее время работает (6.0). Вы можете найти соответствующий запрос на растяжение here.

Мои мужества говорят мне, что причиной различного поведения (по сравнению с другой автоматической переменной) является тот факт, что и вы, и система пытаются написать эту переменную практически одновременно. И хотя я не знаю, почему вы хотели бы написать (я подозреваю, что все началось с if ($? = $true) ...), я согласен с тем, что это действительно противно.