Почему на ключах хеш-таблицы имеются пробелы в конце? - PullRequest
1 голос
/ 09 апреля 2009

Я не понимаю, почему есть разница в конкатенации строк в этом скрипте. Я действительно не понимаю, откуда появляются пробелы? Можете ли вы сказать мне, что не так?

$table = @{
"aaa"=1
}

$x = "qqq"
$y = "rrr"

$table.GetEnumerator() | ForEach-Object { 
Write-Host $_.Key$x            #THIS PRINTS "aaa qqq"
}


Write-Host $x$y   #THIS PRINTS : "qqqrrr"

Ответы [ 4 ]

8 голосов
/ 13 апреля 2009

При обработке аргументов команды синтаксический анализатор PowerShell разбивает смежные выражения на отдельные аргументы, если первый фрагмент является распознаваемым выражением, как в случае с $ (). Поскольку PowerShell основан на объектах, мы стараемся сохранить целостность объекта до тех пор, пока нам абсолютно не придется выполнять рендеринг в строку. Если вы хотите принудительно раскрыть строку, поместите двойные кавычки вокруг всей последовательности аргументов, как предложил один из других плакатов. Обратите внимание, что аргумент с ведущим символом, таким как $ x, будет обрабатываться так, как если бы это была строка в двойных кавычках "a $ x". Это связано с тем, что начальные символы не распознаются как допустимые выражения, поэтому мы по умолчанию рассматриваем его как расширяемую строку.

* 1003 Брюс *

Брюс Пайетт, Команда Windows PowerShell, Microsoft Corp.

2 голосов
/ 10 апреля 2009

Это не происходит только для ключей хеш-таблицы. Посмотрите на это, например:

PS > Write-Host $x.Length$y
3 rrr

Но $x.Length$y не является допустимым выражением:

PS > $x.Length$y
Unexpected token 'y' in expression or statement.
At line:1 char:11
+ $x.Length$y <<<<

То, что должно произойти, - это то, что powershell интерпретирует $x.Length$y как два отдельных выражения перед передачей их в Write-Host, а поскольку их два, Write-Host разделяет их разделителем.

Так что же здесь происходит?:

PS > Write-Host $x$y
qqqrrr

$x$y также не является допустимым выражением:

PS > $x$y
Unexpected token 'y' in expression or statement.
At line:1 char:4
+ $x$y <<<<

Однако в двойных кавычках это допустимая строка:

PS > "$x$y"
qqqrrr

Powershell должен преобразовать $x$y в строку перед передачей ее в Write-Host в качестве единственного аргумента.

По сути, это всего лишь догадки. Это звучит правдоподобно для меня. Короткий ответ: вы можете объединить свои строки вместе, чтобы избавиться от места:

Write-Host ($_.Key + $x)
1 голос
/ 10 апреля 2009

ИМХО, анализатор Powershell принимает

Write-Host $_.Key$a

И разбить его на два выражения, разбив на '$'. По сути, выдача в конвейер двух команд:

Write-Host $_.Key
$x

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

Как вы должны это сделать:

PS C:\Users\jpogran> $table = @{
>> "aaa"=1
>> }
>>
PS C:\Users\jpogran> $x = "qqq"
PS C:\Users\jpogran> $y = "rrr"
PS C:\Users\jpogran> $table

Name                           Value
----                           -----
aaa                            1
PS C:\Users\jpogran> $table.Getenumerator() | %{ Write-host "$($_.key)$x" }
aaaqqq

'$ ()' сообщает синтаксическому анализатору Powershell, что вы хотите, чтобы это свойство этого объекта было расширено, а значение помещалось в строку рядом с тем, что находится после / до.

Джеймс

0 голосов
/ 09 апреля 2009

Что произойдет, если вы соедините ключ и $ x?

$ _. Ключ + $ x

Write-Host, кажется, имеет синтаксис, в котором вы можете вводить переменные, и он разделит их: Write-Host (a, b, c) -separator "_"

Возможно, то, что вы используете, является сокращением для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...