使用PowerShell创建索引文件以导入文档管理系统

时间:2017-10-20 13:15:25

标签: powershell

我正在尝试编写一个PowerShell脚本来创建一个索引文件,我可以用它将大量文档导入我们的文档管理系统。

有几件事:

  • 所有文件都位于同一文件夹中。

  • 所有文件的类型相同,.pdf

  • 创建索引所需的所有信息都在相应文档的文件名中。

所需索引文件的格式为.txt,这是.txt文件中每个新行的格式:

  • IndexField1,IndexField2,IndexField3 @ DocumentPath

三个示例文档:

  • C:\ Test \ Doe,John - Alphabet Elementary - 1st Grade.pdf
  • C:\ Test \ Bay,Michael - Transformer High - 12th Grade.pdf
  • C:\ Test \ Shyamalan,M。Night - Personality High - 10th Grade.pdf

使用上面的示例,结束索引文件需要如下所示:

  • Doe,John,Alphabet Elementary,1年级@ C:\ Test \ Doe,John - Alphabet Elementary - 1st Grade.pdf
  • Bay,Michael,Transformer High,12年级@ C:\ Test \ Bay,Michael - Transformer High - 12th Grade.pdf
  • Shyamalan,M。Night,Personality High,10年级@ C:\ Test \ Shyamalan,M。Night - Personality High - 10th Grade.pdf

我可以创建一个列出文件夹中所有文档的.txt文件。

Get-ChildItem C:\Test\ -name | Out-File C:\Test\results.txt

但是,我不知道从哪里开始解析results.txt的每一行,并附加适当的信息以获取索引文件所需的格式。

任何带领的建议或示例?

1 个答案:

答案 0 :(得分:1)

循环遍历Get-ChildItem返回的对象。然后,您可以将-split-replace与正则表达式一起使用,以过滤掉您要查找的各个部分。然后将它们组合成输出所需的格式。

$Output = Get-ChildItem C:\Test\ | ForEach-Object {
    $Last = ($_.BaseName -split ',')[0]
    $First = $_.BaseName -replace '(^.*?,\s)(.*?)(\s-\s.*)','$2'
    $School = $_.BaseName -replace '(^.*?\s-\s)(.*?)(\s-\s.*)','$2'
    $Grade = ($_.BaseName -split ' - ')[-1]
    $Path = $_.FullName

    # Unsure if there is supposed to be a space before first name.
    "$Last, $First,$School,$Grade@$Path"
}
$Output | Out-File C:\Test\results.txt

您的输出看起来像没有标题的.csv,没有正确的引号。如果您的文档管理系统(DMS)确实需要格式正确的.csvs,那么您可以创建对象数组,然后以CSV格式导出它们。使用ConvertTo-CSV然后Select-Object -Skip 1将允许您跳过文件上的标题。

$Output = Get-ChildItem C:\Test\ | ForEach-Object {
    [pscustomobject]@{
        Last = ($_.BaseName -split ',')[0]
        First = $_.BaseName -replace '(^.*?,\s)(.*?)(\s-\s.*)','$2'
        School = $_.BaseName -replace '(^.*?\s-\s)(.*?)(\s-\s.*)','$2'
        GradeAtPath = "$(($_.BaseName -split ' - ')[-1])@$($_.FullName)"
    }
}
$Output | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File C:\Test\results.txt