Экспорт файлов с проблемой PowerShell

Я пытаюсь экспортировать файлы из дампа данных, и я остро нуждаюсь в некоторой помощи. Все файлы, которые я пытаюсь экспортировать, имеют формат pdf, doc, xlsx, jpg и png. Из-за того, как был собран дамп данных, файлы были переименованы в f0.pdf, f0.doc и т. Д. Кроме того, файлы находятся в разных подпапках (например: Data\000\004\0000001212). Кроме того, в подпапке, если там есть файл, он сопровождается файлом m.xml (для справки, см. Рис. Здесь). Файл 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? Может быть, поле "LDDOCUMENTNAME" в соответствующих файлах m.xml пустое?

Я попытался добавить оператор IF внутри моего цикла FOR, чтобы посмотреть, смогу ли я найти расположение файлов, которые не могут быть экспортированы, но меня встретили с такими же сообщениями об ошибках:

    If ($docM = $null)

     {
        Get-ChildItem -Path C:\Files -include !$docM -Recurse -Force -Name C:\Extracted\listofPaths.txt

        }

    else

Кто-нибудь здесь знает, как это сделать? Я буквально вытаскиваю свои волосы. Любая помощь приветствуется. Спасибо!

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
Другие вопросы по тегам