Почему я получаю разные выходные данные при вводе одной и той же строки в приглашении по сравнению с передачей ее в качестве переменной? - PullRequest
1 голос
/ 08 марта 2019

Может кто-нибудь объяснить мне, почему я вижу разные выходные данные, когда я ввожу одну и ту же строку, которая вводится по запросу powershell, а другая - когда я передаю переменную. Я хотел бы знать, как мне нужно отформатировать строку при вводе ее в командной строке, чтобы получить тот же вывод, который я получаю, когда передаю ее как переменную.

Test.ps1

param (
    [Parameter(Mandatory=$true)]
    [String]
    $NewArgumentString
)

$NewArguments = (Write-Output $NewArgumentString | ConvertFrom-StringData)
$NewArguments

Пробег:

PS> $testString = "HOSTNAME = jburns-test`nIP = 127.0.0.1"
PS> .\test.ps1 -NewArgumentString $testString

Name                           Value
----                           -----
HOSTNAME                       jburns-test
IP                             127.0.0.1


PS> .\test.ps1

cmdlet a.ps1 at command pipeline position 1
Supply values for the following parameters:
NewArgumentString: HOSTNAME = jburns-test`nIP = 127.0.0.1

Name                           Value
----                           -----
HOSTNAME                       jburns-test`nIP = 127.0.0.1

enter image description here

1 Ответ

1 голос
/ 09 марта 2019

Причина, по которой этот код по-разному реагирует на запрос и передачу переменной, заключается в том, что мы имеем дело с разницей между интерпретируемыми строками и литеральными строками.ака одинарные кавычки против двойных кавычек.

Строки в приглашении обрабатываются как буквенные строки, а не интерпретируемые строки.Вот почему в приглашении вы не можете ссылаться на переменные.Чтобы продемонстрировать другой эффект, который это имеет на примере, давайте пробежимся по нему, где мы поменяем двойные кавычки на одинарные кавычки в переданной переменной, чтобы эмулировать запись в строке в приглашении:

PS> $testString = "HOSTNAME = jburns-test`nIP = 127.0.0.1"
PS> $testString2 = 'HOSTNAME = jburns-test`nIP = 127.0.0.1'

PS> .\test.ps1 -NewArgumentString $testString

Name                           Value
----                           -----
HOSTNAME                       jburns-test
IP                             127.0.0.1


PS> .\test.ps1 -NewArgumentString $testString2

Name                           Value
----                           -----
HOSTNAME                       jburns-test`nIP = 127.0.0.1

Здесьмы видим подтверждение того, что буквальная строка в одинарных кавычках интерпретируется так же, как и приглашение. На самом деле происходит, что две строки не одинаковы.Для первой строки в двойных кавычках сразу после назначения PowerShell преобразует комбинацию из двух символов «n» (0x96 + 0x6E) в одиночный символ перевода строки «LF» (0x0A).Мы можем убедиться в этом, сравнив длины строк:

PS> $testString = "HOSTNAME = jburns-test`nIP = 127.0.0.1"
PS> $testString.Length
37

PS> $testString2 = 'HOSTNAME = jburns-test`nIP = 127.0.0.1'
PS> $testString2.Length
38

Чтобы действительно воспроизвести результаты нашей теории в примере, давайте введем в приглашение строку -same- "bitwise", которая хранится в переменнойзаменив `n непечатаемым символом LF (возможно только при использовании метода ALT + numpad ) ALT + 0010

PS> .\test.ps1

cmdlet a.ps1 at command pipeline position 1
Supply values for the following parameters:
NewArgumentString: HOSTNAME = jburns-test
IP = 127.0.0.1

Name                           Value
----                           -----
HOSTNAME                       jburns-test
IP                             127.0.0.1

И вуаля!Мы повторили результаты.PowerShell не сломан.Наша вера в функции и передачу параметров восстановлена!


Кроме того, вероятно, не рекомендуется передавать строки в ваши функции и полагаться на функцию для преобразования ее в хеш-таблицу, поскольку это может датьКак вы продемонстрировали, непредсказуемые результаты.Вместо этого я бы непосредственно передал хеш-таблицу (тип [hashtable]) прямо в функцию:

testHashTable.ps1

param (
    [Parameter(Mandatory=$true)]
    [hashtable]
    $MyHashTable
)

Write-Output $MyHashTable
PS> $testHashTable = @{ "HOSTNAME" = "jburns-test" ; "IP" = "127.0.0.1" }
PS> .\test.ps1 -MyHashTable $testHashTable

Name                           Value
----                           -----
IP                             127.0.0.1
HOSTNAME                       jburns-test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...