0

我有一个 csv 文件:

"SamAccountName","UserPrincipalName","Telephonenumber"
"TUser","TUser@domain.com","+15551112222"

我遍历文件:

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

第一个$row.SamAccountName打印 csv 文件中的 sam 帐户名称字符串。如果我将相同的变量放在引号中,它会打印一个数组。我的输出如下所示:

TUser @{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}.SamAccountName

如果我这样做.GetType()$row.SamAccountName说它是一个System.String. 那么为什么把它放在引号中会打印一个数组呢?

4

3 回答 3

1

它不是打印数组,而是打印对象的文本解释。

如果要在字符串中插入对象属性,则需要使用语法"$($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
}
于 2017-10-23T15:31:20.363 回答
1

当你这样写时:

"$row.SamAccountName"

only$row被识别为变量的一部分,因为$row它是一个输出的数组。如果您想将整个内容写入字符串,请尝试查看.ToString()或将原始语句包装到如下变量中:

"$($row.SamAccountName)"

这样,它将考虑变量的所有部分。

于 2017-10-23T15:32:54.180 回答
0

通过在“$row.SamAccountName”周围使用双引号,您可以告诉 PowerShell 打印该行 IE 该行中的对象数组。从您的输出中我们可以看到:

TUser @{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}.SamAccountName

这是您的写主机声明。首先,您正在编写 $row.SamAccountName,其次您正在添加整个 Row 对象,即数组。双引号中的 .SamAccountName 被视为文字字符串,因此,它不会访问该行来检索其值。

如果您只是将 $row 放在双引号中,您将得到:

@{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}

如果要在变量周围使用双引号,请在尝试访问子表达式时使用。

"$($row.SamAccountName)"

这是 subExpression 形式。

下面的链接有助于了解转义字符和字符串连接。 https://ss64.com/ps/syntax-esc.html

于 2017-10-23T15:41:11.920 回答