使用PowerShell问题导出文件

时间:2017-03-29 04:50:08

标签: xml powershell export substring subdirectory

我正在尝试从数据转储中导出文件,我迫切需要一些帮助。我尝试导出的所有文件都是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

这里有人知道实现这个目标的方法吗?我真的把头发拉了出来。任何帮助将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

由于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