Аргумент игнорируется в Powershell - PullRequest
1 голос
/ 24 октября 2019

Я пытался создать массив с несколькими элементами в Powershell. Одним из элементов должна быть строка с разделителями-запятыми, состоящая из элементов другого массива. Я попытался использовать этот код:

$list = @("a","b")
$result =  @("1 " + $list -join ",", "2")

Я ожидал, что $result будет массивом, состоящим из двух элементов: 1 a,b и 2. Но на самом деле это массив, состоящий из одного элемента 1 a b.

. Эту проблему можно решить, добавив следующие паратезы:

$result = @(("1 " + $list -join ","), "2")

Просмотр Приоритет оператора Powershell, ,, кажется, имеет приоритет над конкатенацией, поэтому эти две строки одинаково относятся к приоритету

$result =  @("1 " + $list -join ",", "2")
$result =  @("1 " + $list -join (",", "2"))

Так что, очевидно, оператор join получает список строк в качестве аргумента. Согласно документации , join принимает только один аргумент.

Мои вопросы:

Что join делает с этим аргументом? И почему не выдает ошибку?

1 Ответ

1 голос
/ 24 октября 2019

Массив, переданный оператору -join с правой стороны, преобразуется в строку. Я не знал, что вы могли бы сделать это.

[string](1,2)
1 2

'a','a' -join 4,5,6
a4 5 6a

Я не уверен, почему поведение с аргументами командлетов отличается. Параметр -filter имеет тип string.

get-childitem -filter *.txt,*.ps1
Get-ChildItem : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Filter'. Specified method is not supported.

В этом примере массив становится строкой:

& { param([string]$a) $a } 1,2,3
1 2 3

Кстати, это миф, что для создания @ () необходимо создатьмассивы. Достаточно запятого.

$list = 'a','b'
$result = ('1 ' + $list -join ','),'2' 
$result
1 a b
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...