我正在构建一个脚本来从一个系统中提取信息并将其放入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
我似乎无法让它发挥作用。有没有人有任何想法?
答案 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一个(返回勾号)