Странная проблема со скриптовым блоком в Powershell ISE: вставка строкового представления в Блокнот выявляет неожиданный символ

Я пытаюсь создать динамический блок скриптов, чтобы я мог использовать переменные в блоке скриптов.

Это мой код:

$Servers = "server1", "server2"

$Command = "c:\plink -t user@" + $Servers[0] + " -pw 'password'"
$Command = [Scriptblock]::Create($Command) 

$Command2 = {c:\plink -t user@server1 -pw 'password'}

$command
$command2

Запуск сценария в PowerShell ISE дает то, что я ожидаю:

c:\plink -t user@server1 -pw 'password'
c:\plink -t user@server1 -pw 'password'

И $command, и $command2 представляют идентичные выходные данные, и оба они являются допустимыми блоками сценариев при проверке с помощью Get-Member -Verbose.

Моя проблема заключается в том, что выполнение первой строки приводит к ошибке соединения, когда идентичный вывод из $command2 работает нормально и подключается к серверу.

Рассматривая проблему, я обнаружил, что копирование / вставка двух произведенных строк в окне вывода ISE к Блокноту обнаруживает проблему:

введите описание изображения здесь

Как вы можете видеть в JPG, сразу после знака "@" добавляется нечетный символ, что приводит к сбою команды...

Есть идеи, почему это происходит (и как я могу это решить)?!?

1 ответ

Решение

Основываясь на отзывах @Fredster:

Оказывается, что невидимый управляющий символ проник в этот оператор присваивания:

$Servers = "server1", "server2"

Используя $Servers[0] чтобы построить строку, которая позже была преобразована в блок скрипта, этот управляющий символ стал невидимой частью блока скрипта и вызвал проблемы при вызове.

Чтобы диагностировать такие проблемы, отправьте значения вFormat-HexКомандлет (PSv5 +), который будет показывать каждый символ, который составляет строку, включая обычно невидимые.
Предостережение: по умолчанию только символы в диапазоне ASCII отображаются правильно; любые другие просто представлены как буквальные ? - использовать -Encoding параметр по мере необходимости.

Другие вопросы по тегам