Ссылка на индекс массива Powershell выдает неожиданные результаты при ссылке на строку - PullRequest
6 голосов
/ 21 декабря 2011

Я пытаюсь выяснить, почему происходит следующее, если у вас есть

$arr = @("Filename1", "Filename2")
for($i =0; $i -le $arr.Length -1; $i++) {

   write-host ".\"$arr[$i]
   write-host ".\$arr[$i]"
   write-host $arr[$i] 
}

Итак, выполнение всего одного цикла приводит к получению:

".\ Filename1"
".\ Filename1 Filename2[0]"
"Filename1"

Просто ссылка на массив [index]будет выдавать правильное значение, но если я конкатенирую со строкой, он помещает пробел между строкой и значением.При размещении в строке я предполагаю, что он выгружает все содержимое, потому что он вычисляет массив $, а затем вычисляет $ i, заканчивая

". \ Filename1 filename2 [index number]"

Но еслиЯ назначаю отдельное значение отдельной переменной и соединяю его со строкой, где нет пробела?Почему это так:

Пример:

 $name = $arr[$i]
 write-host ".\$name"

output = ". \ Filename1"

, что правильно.

Ответы [ 2 ]

14 голосов
/ 21 декабря 2011

Вы должны сделать:

write-host ".\$($arr[$i])"

, чтобы он оценивался как индексирование массива.

Это было бы так, как при доступе к свойствам объекта или ключу хеша и т. Д.внутри строки:

PS > $a = @{test="A";test2="B"}
PS > write-host "$a.test"
System.Collections.Hashtable.test
PS > write-host "$($a.test)"
A

Другой альтернативой является использование форматирования строки, особенно полезно, когда в строке много переменных / объектов:

write-host (".\{0}" -f $arr[$i])
3 голосов
/ 21 декабря 2011

Ваш код должен выглядеть так:

$arr = @("Filename1", "Filename2")
#for($i =0; $i -le $arr.Length-1; $i++) {
for($i =0; $i -le $arr.Length; $i++) {

   write-host ".\"$arr[$i]
   #write-host ".\$arr[$i]"
   write-host ".\$($arr[$i])"
   write-host $arr[$i] 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...