Вот что-то, что споткнуло меня на днях в скрипте Windows PowerShell.Допустим, у вас есть переменные $ user и $ machine, и вы хотите напечатать строку со значением их обоих, разделенных двоеточием (':').
Очевидно, вы можете сделать это с помощью конкатенации строк.:
$user = 'tomasr'
$machine = 'arcano'
write ($user + ':' + $machine)
Это работает, но разве PowerShell не поддерживает эту замечательную функцию интерполяции строк?Да, да, это так!Так почему бы нам просто не переписать это так:
write "$user:$machine"
Но подождите!Если вы запустите эту последнюю строку, все, что вы получите, - это значение переменной $ machine ... куда ушел $ user?
Ответ заключается в том, что двоеточие имеет особое значение в именах переменных PowerShell: оно используетсясвязать переменную с определенной областью или пространством имен.В PowerShell есть несколько областей действия, таких как script и global;так, например, глобальная переменная может быть названа $ global: var.
Но разве мы не видели этот синтаксис где-либо еще?Конечно, как насчет $ env: PATH?То же самое;за исключением того, что env - это не самоцель, а PSDrive.Таким образом, часть перед ':' может быть либо фактической областью, определенной PS, либо PSDrive.Черт возьми, вы даже можете попробовать что-то вроде «$ {c: autoexec.bat}» и наблюдать, как происходит волшебство!
Так что проблема с нашей интерполяцией строк заключается в том, что когда PowerShell видит "$user:$machine"
, он ожидает найтиscope / psdrive с именем «user» и ожидает, что имя переменной будет следовать за «:», но «$» недопустимо, и «user» не является ни областью действия, ни PSDrive, что немного смущает PowerShell.Но так как он слишком джентльмен, он просто исправляет это настолько хорошо, насколько может, и игнорирует все до этого момента и просто сбрасывает $ machine без жалоб.Очень мило с его стороны, но это действительно может сбить вас с толку, если вы этого не ожидаете!
Можем ли мы избежать этого?Да, мы можем, просто разделив имена переменных точно для PowerShell, используя '{}', например:
write "${user}:$machine"
Раздел 5.8 на стр. 141 превосходного Windows PowerShell в действии Брюса Пайетта охватывает тему переменныхв PowerShell и дал мне подсказку, чтобы обойти эту проблему.