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