2017-10-20 76 views
0

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

几件事情:

  • 的文件全部都位于同一个文件夹中。

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

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

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

  • IndexField1,IndexField2,IndexField3 @ DocumentPath

三个例子文件:

  • C:\测试\李四,约翰 - 字母小学 - 第一Grade.pdf
  • C:\测试\湾,迈克尔 - 变压器高 - 第12届Grade.pdf
  • C:\测试\沙马兰,M.夜 - 人格高 - 第10 Grade.pdf

结束索引文件需要像这样使用上面的例子:

  • DOE,约翰,字母小学,一年级@ C:\测试\李四,约翰 - 字母小学 - 第一Grade.pdf
  • 湾,迈克尔,变压器高,12年级@ C:\测试\湾,迈克尔 - 变压器高 - 12年级.pdf
  • 沙马兰,M.夜,人格高,10年级@ C:\测试\沙马兰,M.夜 - 人格高 - 第10 Grade.pdf

我可以创建一个文本文件列出所有的文件夹内的文件。

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

不过,我不知道从哪里开始解析RESULTS.TXT的每一行,并追加相应的信息以获得所需的索引文件的格式。

任何建议或示例带领?

回答

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,[email protected]$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