Странная проблема со скриптовым блоком в 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
параметр по мере необходимости.