Экспорт файлов с проблемой 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