通过CSV循环写入错误日志

时间:2017-09-05 14:13:27

标签: regex powershell csv logging import

我正在处理一个文本文件(名为list_names.txt),其中包含以逗号分隔的值:

"old_name.pdf","new_name.pdf"
"old_name2.pdf", "new_name2.pdf"
...

new_name列值应该包含字母后跟数字(例如:abcd_12.pdf),但其中一些记录错误,只包含下划线后的数字(例如:_12.pdf)。 / p>

我想创建一个错误日志,记录所有带有此错误的行,并尝试为其编写脚本。

$myHeader = echo OldName NewName

$csv = Import-Csv $PSScriptRoot\list_names.txt -Header $myHeader
foreach ($line in $csv) {
    if ($line.NewName -eq "`"`_[0-9]*.pdf`"") {
        Add-Content -Path $PSScriptRoot\ocr_error.txt -Value "ERROR reading $line.FileName"
    }
}

当我运行它时,ocr_error.txt没有输出。

1 个答案:

答案 0 :(得分:4)

您需要使用-Match并将您的RegEx更改为'^_\d*\.pdf$'。您还需要使用子表达式运算符$()来访问Error输出行中$line变量的属性:

$myHeader = echo OldName NewName
$csv= Import-Csv $PSScriptRoot\list_names.txt -Header $myHeader 

Foreach ($line in $csv) {
    if ($line.NewName -match '^_\d*\.pdf$') {
        Add-Content -path $PSScriptRoot\ocr_error.txt -Value "ERROR reading $($line.OldName)" 
    }
}

-Match比较运算符允许您使用正则表达式,而-Eq则不允许。

您不需要在RegEx中加入语音标记,因为它们会被Import-CSV自动删除。

根据Ansgar的评论,RegEx模式'^_\d*\.pdf$'确保它仅匹配字符串,其中_位于字符串的开头,后跟任意数量的数字(现在由正则表达式令牌表示) \d而不是数字范围)并以.pdf结尾(其中\需要继续.以阻止它被解释为RegEx令牌。