true портит обработку escape-кода в Powershell?

Только что я заметил что-то странное в своем сценарии Powershell и, наконец, сузил его до ошибки в моем коде, это была эта строка:

$AnyExecuted = true

Это должно было быть

$AnyExecuted = $true

Однако эта строка портит обработку escape-кода как в автономных окнах Powershell Core в Windows 10, так и в терминале Windows:

перепутанная подсказка

Кто-нибудь знает, почему это происходит? Что такое выражение true? Я не могу найти упоминания об этом, и почему это так влияет на вывод из Powershell?

Обратите внимание: очевидно, я обновил свой скрипт, чтобы использовать $true, что я и предполагал, этот вопрос как раз о том, что такое true.


person Lasse V. Karlsen    schedule 23.06.2020    source источник


Ответы (1)


При выполнении

$AnyExecuted = $true

$AnyExecuted будет иметь тип Boolean, и ваш скрипт может работать как положено. Если вы выполните

$AnyExecuted = true

вместо этого и ошибка не выдается, значит, имеется псевдоним, командлет или исполняемый файл с именем true. Он будет недоступен при установке Windows 10 по умолчанию.

Поскольку это не вызывает ошибки на вашей стороне, у вас может быть true каким-то образом доступным. Вы можете проверить это с помощью Get-Command true. Например, использование среды MinGW делает true.exe доступным.

Использование результата вашей еще неизвестной true вещи действительно может привести к неожиданному поведению. Чтобы изучить результат true, вы можете оценить (true).GetType() в своей системе.

person stackprotector    schedule 23.06.2020
comment
Да, ваш ответ содержит больше подробностей о том, как устранить проблему, чем мой собственный, поэтому я удалил свой и принял ваш. У меня был установлен Cygwin, в котором было true.exe. - person Lasse V. Karlsen; 23.06.2020
comment
И соедините это с моим непониманием того, что произойдет, если я выполню If (FunctionCall), который также выводит, если что-то было сделано, казалось, что это работает так, как должно. - person Lasse V. Karlsen; 23.06.2020