【发布时间】:2017-08-22 09:58:29
【问题描述】:
我正在尝试从数据转储中导出文件,我急需一些帮助。我尝试导出的所有文件都是 pdf、doc、xlsx、jpg 和 png 格式。由于数据转储的组装方式,文件被重命名为 f0.pdf、f0.doc 等,此外,这些文件位于不同的子文件夹中(例如:Data\000\004\0000001212)。此外,在子文件夹中,如果其中有一个文件,它会附带一个 m.xml 文件(参考请参见图片here)。 m.xml 文件很重要,因为它包含“LDDOCUMENTNAME”字段反映的原始文件名:
ex: <TextVar length="255" field="LDDOCUMENTNAME">ABC.pdf</TextVar>
我尝试使用 PowerShell 重命名和导出文件,但是一些 pdf 文件没有通过(我搜索了子文件夹中的所有 pdf 文件并将其与导出的 pdf 文件的数量进行了比较)。
这是我的脚本的样子:
$fsoFiles = Get-ChildItem -Path C:\Files -Filter *m.xml* -Recurse
ForEach($fsoFile in $fsoFiles)
{
$docM = Select-String $fsoFile -Pattern "LDDOCUMENTNAME"
$txtNewFile = $docM.Line.Substring(0,($docM.Line.Length-10))
$txtNewFile = $txtNewFile.Split(">")[-1]
$txtExtension = $txtNewFile.Split(".")[-1]
$txtOldFile = ([string]$fsoFile.Directory+"\"+"f0."+$txtExtension)
Copy-Item $txtOldFile C:\Extracted\$txtNewFile
}
基本上,我要求 PowerShell 搜索所有子文件夹并仅过滤掉带有 m.xml 文件的文件夹。然后,PowerShell 应该使用“LDDOCUMENTNAME”字段中的值将相应的文件重命名为其原始文件名。
当我运行我的脚本时,我会看到一堆这样的错误消息:
You cannot call a method on a null-valued expression.
At line:6 char:5
+ $txtNewFile = $docM.Line.Substring(0,($docM.Line.Length-10))
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
我假设这就是 PowerShell 无法导出某些 pdf 文件的原因?也许相应的 m.xml 文件中的“LDDOCUMENTNAME”字段是空白的?
我尝试在我的 FOR 循环中添加一个 IF 语句,以查看是否可以获得无法导出的文件的位置,但我遇到了相同的错误消息:
If ($docM = $null)
{
Get-ChildItem -Path C:\Files -include !$docM -Recurse -Force -Name C:\Extracted\listofPaths.txt
}
else
这里有人知道实现此目的的方法吗?我真的把我的头发拉了出来。任何帮助将非常感激。谢谢!
【问题讨论】:
-
为什么不直接将 XML 解析为 XML 文档呢?不需要拆分子串修改?
-
感谢您的回复!这实际上是我第一次使用 PowerShell。你能指出我如何做到这一点的正确方向吗?谢谢!
-
正确的方向是谷歌搜索......无论如何,SO 已经有了很好的答案。如果您在执行过程中遇到问题,请提供有效的 XML 文档而不是片段。
-
这是 xml 文件之一。 pastebin.com/VcbVu4rg 谢谢!
标签: xml powershell export substring subdirectory