使用Import-Csv时如何分别输出多个变量的值?
问题解析与解决方案
为什么Import-Csv的输出会合并?
咱们先搞清楚两种变量的本质区别:
- 第一个例子里,
$var1和$var2是字符串数组([string[]]类型)。当你把字符串数组传给Write-Host时,PowerShell会自动把数组"展开",将每个字符串作为独立的参数传递给Write-Host,所以最终输出是每个元素分开显示(默认用空格分隔,直接输出数组不用Write-Host的话会每行一个)。 - 而
Import-Csv返回的是PSCustomObject数组(每个元素是包含CSV列属性的自定义对象)。当你把对象数组直接传给Write-Host时,PowerShell不会展开数组,而是会把整个数组转换成一个字符串——它会调用每个对象的ToString()方法(默认输出@{列名=值}这种格式),然后把这些字符串用空格拼接在一起,所以看起来就是"合并"的一大串内容。
怎么让Import-Csv的输出和第一种场景一致?
根据你的需求,有几种灵活的解决方式:
方法1:放弃Write-Host,直接输出变量(推荐)
PowerShell对对象数组有默认的格式化逻辑,直接输出变量会自动以易读的格式(比如表格、列表)展示每个对象,完全不需要额外处理:
$var1 = Import-Csv .\Servers1.csv $var2 = Import-Csv .\Servers2.csv Write-Host "`nShow me var1`n" $var1 # 直接输出,PowerShell会自动格式化显示每个对象 Write-Host "`nShow me var2`n" $var2
方法2:遍历对象数组,逐个输出(适合需要自定义输出内容的场景)
如果你一定要用Write-Host,可以遍历数组,逐个输出对象(或者对象的指定属性):
$var1 = Import-Csv .\Servers1.csv $var2 = Import-Csv .\Servers2.csv Write-Host "`nShow me var1`n" $var1 | ForEach-Object { Write-Host $_ } # 输出每个对象的默认字符串形式 # 如果你只想显示某个属性(比如CSV里的"ServerName"列),可以指定: # $var1 | ForEach-Object { Write-Host $_.ServerName } Write-Host "`nShow me var2`n" $var2 | ForEach-Object { Write-Host $_ }
方法3:将对象数组转换为字符串数组(和第一个场景完全一致)
如果你的CSV只有一列(或者只需要某一列的值),可以直接提取该列的值生成字符串数组,这样就和第一个例子的变量类型完全一样了:
# 假设你的CSV列名为"ServerName",提取该列作为字符串数组 $var1 = (Import-Csv .\Servers1.csv).ServerName $var2 = (Import-Csv .\Servers2.csv).ServerName Write-Host "`nShow me var1`n" $var1 Write-Host "`nShow me var2`n" $var2
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

