PowerShell以CSV格式替换文本

时间:2014-08-29 13:27:00

标签: powershell csv powershell-v3.0

我正在构建一个脚本来从一个系统中提取信息并将其放入CSV以供另一个系统使用。在此之前我必须做一些数据清理。我从系统中拉出用户ID,它们以dom \ userid形式出现。对于我的其他系统使用它我必须只有没有dom的用户ID。我使用下面的代码删除dom,这有效:

    $csv = Import-Csv C:\Support\Broker.csv
$csv | %{ If ($_.LastConnectionUser -like "*DOM*") { $_.LastConnectionUser -replace 'DOM', '' } }
$csv | Export-Csv C:\Support\Broker.csv -NoTypeInformation -Force

这给我留下了\ userid。一旦我将\添加到替换字符串,系统就会发疯,因为它试图解释\并且无法进行替换,所以我尝试了以下

$csv = Import-Csv C:\Support\Broker.csv
    $csv | %{ If ($_.LastConnectionUser -like "*DOM*") { $_.LastConnectionUser -replace 'DOM`\', '' } }
    $csv | Export-Csv C:\Support\Broker.csv -NoTypeInformation -Force

我得到了同样的错误

  

错误:正则表达式模式无效:DOM_WFLD \. broker.ps1 (24): ERROR: At Line: 24 char: 54 ERROR: + $csv | %{ If ($_.LastConnectionUser -like "*DOM*") { $_.LastConnectionUser -repl ... ERROR: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ERROR: + CategoryInfo : InvalidOperation: (DOM_WFLD:String)[],RuntimeException   错误:+ FullyQualifiedErrorId:InvalidRegularExpression

我似乎无法让它发挥作用。有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

在包含$csv | %{ If ($_.LastConnectionUser -like "*DOM*") { $_.LastConnectionUser -replace 'DOM \',''的行上`

它可以简化并且更加通用。

$csv | %{ $_.LastConnectionUser -replace '\w+\\'}

如果不是真的需要这样的声明,因为你正在采取的行动不会显着增加处理时间。如果用户名包含DOM,那么您的IF将匹配,我认为这不是您的意图。

哪个会替换\前面的所有字符,包括\本身。正如David解释的那样,你需要转义\,因为它是正则表达式中的特殊字符。没有第二个参数的-replace会自动删除匹配。

答案 1 :(得分:0)

$csv = Import-Csv C:\Support\Broker.csv
    $csv | %{ If ($_.LastConnectionUser -like "*DOM*") { $_.LastConnectionUser -replace 'DOM\\', '' } }
    $csv | Export-Csv C:\Support\Broker.csv -NoTypeInformation -Force

你必须使用的转义是正则表达式一个(所以反斜杠),而不是PowerShell一个(返回勾号)