Сегодня я использовал автозаполнение табуляции для имени переменной в Powershell 5.1 и заметил, что одним из вариантов было имя PSDrive. Имя диска docs
, и я хотел расширить, называется $document_name
. Когда я набрал $do<tab>
, оболочка действительно расширила то, что я набрал, до $document_name
, но по какой-то причине я набрал <tab>
во второй раз, и тогда расширенный текст изменился на $docs:
.
Я провел дальнейшие исследования и обнаружил, что переменные этого типа существуют для каждого из моих PSDrive, или, по крайней мере, расширение вкладок предполагает, что это так.
Более формально, для каждого PSDrive PSD , расширение вкладки считает, что $PSD:
- действительная вещь.
Мой вопрос прост: какого чёрта это? Вот некоторые наблюдения, которые я сделал до сих пор:
- Эти имена имеют префикс
$
, поэтому они выглядят как переменные PS. В остальной части этого обсуждения (и в предыдущем обсуждении выше) я буду считать, что они являются переменными, и буду называть их таковыми.
- Несмотря на то, что они кажутся переменными, они не перечислены в
Variable:
PSDrive, как большинство переменных. Таким образом, он ведет себя как «переменная» $env
, которая также не указана в Variable:
. У меня есть ощущение, что если бы я мог найти документацию о $env
, то я бы тоже понял эти объекты.
- В некотором смысле они ведут себя как указатели на объекты файловой системы. Например, если есть имя файла
readme.txt
, содержащее текст «Hello, world!» на PSDrive с именем code
возможны следующие взаимодействия с Powershell.
Получить содержимое файла.
λ ${code:\readme.txt}
Hello, world!
Просто чтобы доказать, что тип приведенного выше результата String
:
λ ${code:\readme.txt} | % { $_.GetType().Name }
String
Попытка использовать это как ссылку на PSDrive не работает для многих операций, таких как cd
:
C:\
λ cd ${code:}
At line:1 char:4
+ cd ${code:}
+ ~~~~~~~~
Variable reference is not valid. The variable name is missing.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : InvalidBracedVariableReference
Я мог бы продолжать, но я в тупике. Если я передам $code:
(или $env:
, в этом отношении) на Get-Member
, я получу сообщение об ошибке Variable reference is not valid
.
Так что, черт возьми, такие "переменные", как $env
и $<PSDrive>:
(например, $code:
)? Это выражения? Встроенные выражения? Какой-то объект? Спасибо за любую помощь.