【问题标题】:Exporting files with PowerShell issue导出带有 PowerShell 问题的文件
【发布时间】: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


【解决方案1】:

由于 XML 文件并非微不足道,因此不应将其作为文本处理。将其作为 XML 加载并使用 XPath 选择相关节点。像这样,

# XML is 1st class citizen in Powershell 
[xml]$doc = get-content c:\path\to\doc.xml 
# Select all the TextVar nodes that have attribute field='LDDOCUMENTNAME'
$nl = $doc.selectnodes("//TextVar[@field='LDDOCUMENTNAME']")
# Did we find one?
if($nl.count -eq 1) {
    # Do something with the element's text data
    # Rename the data file would happen here, for now
    # print the results for further review
    Write-Host $nl[0].InnerText 
}
# Todo: handle no elements found case
# Todo: handle multiple elements found case

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2018-06-22
    • 2017-07-03
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多