0

我正在尝试替换 CSV 中的一行并保留数组结构,请参阅 CSV 和代码示例:

CSV 示例:

Computer,Domain
DC001,contoso.local
DB001,contoso.local
AB001,contoso.local

代码:

[array]$csv= Import-Csv c:\docs\MyCsv.csv
$newCSv = $csv | ForEach { $_.Domain -replace "contoso", "MyDomainName" }

Output of $newCsv:

MyDomainName.local
MyDomainName.local
MyDomainName.local

Desired output $newCsv:

 Computer Domain       
-------- ------       
DC001    MyDomainName.local
DB001    MyDomainName.local
AB001    MyDomainName.local

我尝试过管道,| Select Computer, Domain但这不起作用。有没有办法来解决这个问题?

4

2 回答 2

2

要输出新的 CSV,您需要指定其属性。要仅更改一列中的值,您可以使用Select-Object计算属性:

$newCsv = Import-Csv -Path 'D:\Test\MyCsv.csv' | 
          Select-Object Computer, 
                        @{Name = 'Domain';Expression = {$_.Domain -replace "contoso", "MyDomainName" }}

#output on screen
$newCsv

# write to new csv file
$newCsv | Export-Csv -Path 'D:\Test\MyNewCsv.csv' -NoTypeInformation

输出

Computer Domain            
-------- ------            
DC001    MyDomainName.local
DB001    MyDomainName.local
AB001    MyDomainName.local
于 2020-10-14T14:21:02.510 回答
2

您根本没有修改您的 csv,请在将命令的输出分配给变量之前检查它的输出。

$csv = @'
Computer,Domain
DC001,contoso.local
DB001,contoso.local
AB001,contoso.local
'@ | ConvertFrom-Csv

$csv | foreach {$_.domain -replace 'contoso','MyDomainName'}

MyDomainName.local
MyDomainName.local
MyDomainName.local

您将该输出分配$newcsv给与$csv. 如果要替换其中一个属性中的文本,则需要这样做。

$csv | foreach {$_.domain = $_.domain -replace 'contoso','MyDomainName'} # No output

将替换的文本从属性.domain重新分配到.domain现在,看看内容$csv

$csv

Computer Domain            
-------- ------            
DC001    MyDomainName.local
DB001    MyDomainName.local
AB001    MyDomainName.local

现在你可以导出它了

$csv | Export-Csv $somefile -NoType
于 2020-10-14T14:23:45.550 回答