PowerShell 变量打印文件中的所有 csv 列

PowerShell variable printing all csv columns from file

我有一个 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

如果我在 $row.SamAccountName 上执行 .GetType(),则表示它是 System.String。那么为什么将它放在引号中会打印一个数组?

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

如果要在字符串中插入对象 属性,则需要使用语法 "$($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
}

当你这样写的时候:

"$row.SamAccountName"

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

"$($row.SamAccountName)"

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

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

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

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

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

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

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

"$($row.SamAccountName)"

这是子表达式形式。

下面的link是为了帮助学习转义字符和字符串连接。 https://ss64.com/ps/syntax-esc.html