Переменная PowerShell, печатающая все столбцы csv из файла

У меня есть CSV-файл:

"SamAccountName","UserPrincipalName","Telephonenumber"
"TUser","[email protected]","+15551112222"

Я перебираю файл:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    Write-Host $row.SamAccountName, "$row.SamAccountName"
}

Первый $row.SamAccountName печатает строку имени учетной записи sam из CSV-файла. Если я помещу ту же переменную в кавычки, она напечатает массив. Мой вывод выглядит так:

TUser @{SamAccountName=TUser; [email protected]; Telephonenumber=+15551112222}.SamAccountName

Если я делаю .GetType() на $row.SamAccountName, это говорит, что это System.String. Так почему же помещение его в кавычки печатает массив?


person jes516    schedule 23.10.2017    source источник


Ответы (3)


Когда пишешь вот так:

"$row.SamAccountName"

только $row распознается как часть переменной, а поскольку $row является массивом, то он и выводит. Если вы хотите записать все это в строку, попробуйте заглянуть в .ToString() или обернуть исходный оператор в переменную, подобную этой:

"$($row.SamAccountName)"

таким образом, он будет рассматривать все как часть переменной.

person CuriousOne    schedule 23.10.2017

Он печатает не массив, а текстовую интерпретацию объекта.

Если вы хотите интерполировать свойство объекта в строку, вам нужно использовать синтаксис "$($object.property)". Таким образом, изменение, как показано ниже, будет работать:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    Write-Host $row.SamAccountName, "$($row.SamAccountName)"
}

Или используйте оператор строки формата:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    "{0}" -f $row.SamAccountName
}
person arco444    schedule 23.10.2017

Используя двойные кавычки вокруг «$row.SamAccountName», вы указываете PowerShell, что нужно распечатать строку, т. е. массив объектов из этой строки. Как мы видим из вашего вывода:

TUser @{SamAccountName=TUser; [email protected]; Telephonenumber=+15551112222}.SamAccountName

Это ваше заявление Write-Host. Во-первых, вы пишете $row.SamAccountName, а во-вторых, вы добавляете весь объект Row, то есть массив. .SamAccountName в двойных кавычках воспринимается как буквальная строка, поэтому он не обращается к строке для получения ее значения.

Если вы просто поместите $row в двойные кавычки, вы получите это:

@{SamAccountName=TUser; [email protected]; Telephonenumber=+15551112222}

Если вы хотите использовать двойные кавычки вокруг переменной, используйте это, если вы пытаетесь получить доступ к подвыражению.

"$($row.SamAccountName)"

Это форма подвыражения.

Ссылка ниже поможет узнать об escape-символах и конкатенации строк. https://ss64.com/ps/syntax-esc.html

person Chanced270    schedule 23.10.2017