使用-replace从csv中的单元格中删除带有特殊字符的字符串

时间:2017-06-08 14:21:04

标签: windows powershell csv

我有一个CSV文件,如:

"localpath"
"C:\Users\calabresel"
"C:\Users\goslinep"
"C:\Users\deangelisr"
"C:\Users\bannont"
"C:\Users\goodwind"

我正在寻找一种方法来隔离每个字段的用户名。然后,我将查询AD以确定是否已禁用或启用每个用户。我一直无法弄清楚如何获得最后一块。我的想法是使用-replace将null替换为相同的字符串,如下所示:

$txt = import-csv paths1.csv | % {$_.localpath = $_.localpath -replace "C:\Users\", ""}

返回时出现了无效的正则表达式模式错误,虽然我认为这是由包含特殊字符(反斜杠)的目标字符串的结果。然后我开始寻找一种方法让PowerShell取代\字面。这导致我尝试这个:

$txt = import-csv paths1.csv | % {$_.localpath = $_.localpath -replace [Regex]::Escape("C:\\Users\\"), ""}

和这个

$txt = import-csv paths1.csv | % {$_.localpath = $_.localpath -replace "C:\\Users\\", ""}

这两种方法都会停止无效的正则表达式错误,只是在没有抱怨的情况下返回一条新行。但是,当我打印$txt变量时,它是空的......

我确定我从错误的角度和/或语法不正确处理这个问题,但我可以使用一些指导,因为我刚开始使用PowerShell一周前。

非常感谢提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

以下内容将导入CSV文件,然后获取路径的叶子。即用户名。

$txt = Import-Csv paths1.csv | ForEach-Object { Split-Path $_.localpath -leaf }

如果您仍想使用替换方法,只需取出$_.localpath =部分就可以了。

$txt = Import-Csv C:\@@Scatch\test.csv | % { $_.localpath -replace "C:\\Users\\", ""}

答案 1 :(得分:2)

您没有收到$txt的任何内容的原因是您更新了$_的属性,但又没有返回$_

假设您要使用正则表达式而不是Split-Path

$txt = import-csv C:\temp\test.csv | % {
    $_.localpath = $_.localpath -replace "C:\\Users\\", ""
    $_
}

$txt = import-csv C:\temp\test.csv | % {
    $_.localpath -replace "C:\\Users\\", ""
}

答案 2 :(得分:2)

其他解决方案

Get-Content "C:\temp\test.txt" | select @{N="Value";E={$_.split('\')[-1].replace('"', '')}} -Skip 1