Як перетворити об’єкт масиву в рядок в PowerShell?


175

Як я можу перетворити об’єкт масиву в рядок?

Я намагався:

$a = "This", "Is", "a", "cat"
[system.String]::Join(" ", $a)

не пощастило . Які різні можливості в PowerShell?


5
Дивіться мою відповідь, але ваш код також працює чудово. Чому ви говорите "без везіння"?
Роман Кузьмін

4
Вибачте, так, це, здається, працює, я думаю, що я щось зіпсував, коли перевірив це.
jrara

Відповіді:


294
$a = 'This', 'Is', 'a', 'cat'

Використання подвійних лапок (і необов'язково використовувати роздільник $ofs)

# This Is a cat
"$a"

# This-Is-a-cat
$ofs = '-' # after this all casts work this way until $ofs changes!
"$a"

Використання оператора приєднання

# This-Is-a-cat
$a -join '-'

# ThisIsacat
-join $a

Використання конверсії в [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a

9
Для необізнаного (як я) $ofsдокументована тут
Ліам

13
Документація щодо Stackoverflow була закрита, тому посилання Ліама не працює. Ось ще одне пояснення $ OFS, сепаратора вихідного поля: blogs.msdn.microsoft.com/powershell/2006/07/15/…
Саймон Тевсі

Чому його називають OFS? Це дивне ім'я, враховуючи, що його називають IFS на стандартній оболонці десятиліттями і десятиліттями.
Йохан Буле

1
@ JohanBoulé: Оскільки використання першого символу сепаратора поля введення в якості сепаратора вивідного поля є неприємним злом - і не дозволяє розділяти поля багаторядковими рядками. (Awk, наприклад, має змінні FS та OFS).
Мартін Боннер підтримує Моніку

@martin bonner: спасибі, зараз має сенс. Я не знаю, як я це зіпсував.
Йохан Буле

36

Я виявив, що підключення масиву до Out-Stringкомандлету також добре працює.

Наприклад:

PS C:\> $a  | out-string

This
Is
a
cat

Від вашої кінцевої мети залежить, який метод найкраще використовувати.


4
FYI: просто $aдію матиме такий самий ефект, як$a | out-string
JohnLBevan

7
@JohnLBevan Не завжди. ($a | out-string).getType()= Рядок. $a.getType()= Об’єкт []. Якщо ви використовуєте $ a в якості аргументу методу, що очікує рядок (наприклад, invoke-expressionнаприклад), то $a | out-stringявна перевага.
rojo

18
1> $a = "This", "Is", "a", "cat"

2> [system.String]::Join(" ", $a)

Другий рядок виконує операцію та виводить хост, але не змінює $ a:

3> $a = [system.String]::Join(" ", $a)

4> $a

This Is a cat

5> $a.Count

1

10

З труби

# This Is a cat
'This', 'Is', 'a', 'cat' | & {"$input"}

# This-Is-a-cat
'This', 'Is', 'a', 'cat' | & {$ofs='-';"$input"}

Пишіть-приймаюче

# This Is a cat
Write-Host 'This', 'Is', 'a', 'cat'

# This-Is-a-cat
Write-Host -Separator '-' 'This', 'Is', 'a', 'cat'

Приклад


Це дивовижна хитрість. Приклад більше не працює, і хоча цій відповіді 5 років, я намагаюся пояснити, що я сьогодні дізнався. $ofsЄ Output Field Separatorзмінною , яка використовується , коли масив перетворюється в рядок для виведення. Тут він задається в блоці скриптів, що повертає рядкове значення вхідного сигналу (масиву з труби), яке виконується командою &. Я про це $ofsраніше не знав , а також &прийняв блок-сценарій як аргумент
Мартін Конопка,

3

Ви можете вказати такий тип:

[string[]] $a = "This", "Is", "a", "cat"

Перевірка типу:

$a.GetType()

Підтверджує:

    IsPublic IsSerial Назва BaseType
    -------- -------- ---- --------
    True True String [] System.Array

Виведення $ a:

PS C: \> $ a 
Це 
Є 
а 
кіт

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.