Как преобразовать объект массива в строку в PowerShell?

175

Как я могу преобразовать объект массива в строку?

Я попытался:

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

не повезло . Каковы различные возможности в PowerShell?

jrara
источник
5
Посмотрите мой ответ, но ваш код тоже работает отлично. Почему вы говорите «без удачи»?
Роман Кузьмин
4
Извините, да, похоже, это работает, я думаю, что я что-то напутал, когда проверял это.
Джрара

Ответы:

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"

Использование оператора join

# 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
К вашему сведению: просто делать $aбудет иметь такой же эффект, как$a | out-string
JohnLBevan
7
@JohnLBevan Не всегда. ($a | out-string).getType()= Строка $a.getType()= Объект []. Если вы используете $ a в качестве аргумента для метода, ожидающего строку (например, invoke-expressionнапример), $a | out-stringэто дает явное преимущество.
Рохо
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
TCC
источник
10

Из трубы

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

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

Написать-Host

# 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 Name BaseType
    -------- -------- ---- --------
    True True String [] System.Array

Вывод $ a:

PS C: \> $ a 
это 
Является 

кошка
Амир Дин
источник
0
$a = "This", "Is", "a", "cat"

foreach ( $word in $a ) { $sent = "$sent $word" }
$sent = $sent.Substring(1)

Write-Host $sent
Underverse
источник