PowerShell - извлечь данные из XML, а затем найти в каталоге - PullRequest
0 голосов
/ 08 января 2020

Я надеюсь, что смогу получить столь необходимый совет для части работы, которую я несколько раз бросал. * Примечание. У меня нет информации о текущем дизайне.

Текущий процесс

Мы получаем заявки через наш веб-сайт, как только заявка завершена, создается КАТАЛОГ с уникальным идентификатором в качестве имени - Затем создается ПОДРАЗДЕЛЕНИЕ с другим уникальным идентификатором. Они находятся в папке PARENT, называемой «Приложения»

. В этой подкатегории есть список файлов;

  • Application_Form.pdf (существует только 1)
  • Proof_of_address .jpg (заявитель может загрузить от 1 до 10 изображений)
  • Passport_Photo.jpg (заявитель может загрузить от 1 до 10 изображений)
  • Photo.jpg (заявитель может загрузить от 1 до 10 изображений)
  • Приложение. xml (существует только 1)

Directory

В настоящее время у нас есть расписание задач, запускающее скрипт .bat каждые 5 минут, которые перемещают каждую папку в каталоге «Applications» на внутренний сервер.

Проблема, с которой мы часто сталкиваемся, заключается в том, что скрипту не важно, какие файлы находятся в этих каталогах, поэтому если заявитель проходит путь загрузки документов не все документы проверяются.

Решение

Создайте сценарий PowerShell, который;

  1. Извлекает имена файлов из приложений. xml
  2. «если существует» с этими именами файлов.
  3. Если все файлы существуют в каталоге, переместите каталог верхнего уровня на внутренний сервер.
  4. Если его не существует, пропустите и go к следующему каталогу. .

Приложения. xml фиксирует все имена файлов и может рассматриваться как «евангелие».

XML Пример

<?xml version="1.0" encoding="utf-8"?>
<DOCUMENTS>
  <DOCUMENT>
    <DOCTYPE>APPLIC</DOCTYPE>
    <FILENAME>Proof1 Bank Statement.jpg</FILENAME>
    <IMAGES>
      <IMAGE SOURCE="Proof1_721ee515-8a29-4898-acb1-696acfa288a1.jpg"></IMAGE>
    </IMAGES>
  </DOCUMENT>
  <DOCUMENT>
    <DOCTYPE>APPLIC</DOCTYPE>
    <FILENAME>Passport1.jpg</FILENAME>
    <IMAGES>
      <IMAGE SOURCE="Passport1_721ee515-8a29-4898-acb1-696acfa288a1.jpg"></IMAGE>
    </IMAGES>
  </DOCUMENT>
  <DOCUMENT>
    <DOCTYPE>PHOTO</DOCTYPE>
    <FILENAME>Photo.jpg</FILENAME>
    <IMAGES>
      <IMAGE SOURCE="Photo1_721ee515-8a29-4898-acb1-696acfa288a1.jpg"></IMAGE>
    </IMAGES>
  </DOCUMENT>
  <DOCUMENT>
    <DOCTYPE>APPLIC</DOCTYPE>
    <FILENAME>Application_Form_721ee515-8a29-4898-acb1-696acfa288a1.pdf</FILENAME>
    <IMAGES>
      <IMAGE SOURCE="Application_Form_721ee515-8a29-4898-acb1-696acfa288a1.pdf"></IMAGE>
    </IMAGES>
  </DOCUMENT>
</DOCUMENTS>

Это мой сценарий:

$Path = "C:\Temp\Scripts\Transfer\Applications\*\*\*.xml"
Get-ChildItem -Path $Path -Filter *xml | ForEach-Object {


$XPath = "//IMAGE"
Select-Xml -Path $Path -XPath $Xpath | Select-Object -ExpandProperty node

} 

} 

Это выводит как;

SOURCE                                                                                                                                                                   
------                                                                                                                                                                   
Proof1_721ee515-8a29-4898-acb1-696acfa288a1.jpg                                                                                                                          
Passport1_721ee515-8a29-4898-acb1-696acfa288a1.jpg                                                                                                                      
Photo1_721ee515-8a29-4898-acb1-696acfa288a1.jpg                                                                                                                          
Application_Form_721ee515-8a29-4898-acb1-696acfa288a1.pdf    

Имея это в виду, я застрял на первом этапе, используйте PowerShell для захвата имен файлов в приложениях. xml. Мне удалось получить вышеуказанный результат, но только в объемном виде. Как можно разделить этот список на отдельные результаты, чтобы я мог затем выполнить функцию «если существует», чтобы проверить каталог для вышеуказанных файлов, и, если все вышеперечисленное существует, скопировать каталог верхнего уровня в Приложениях на внутренний сервер?

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 08 января 2020

Вы делаете это правильно. Просто нужно добавить еще один шаг, чтобы получить вывод Select-Xml в переменную и l oop через него следующим образом.

Get-ChildItem -Path $Path -Filter *xml | ForEach-Object {

$dirPath = [System.IO.Path]::GetDirectoryName($_.FullName)
Write-Host $_.FullName
Write-Host $dirPath

$XPath = "//IMAGE"
$files = Select-Xml -Path $_.FullName -XPath $Xpath | Select-Object -ExpandProperty node
Foreach($file in $files)
{
#Write-Host $file.SOURCE
  if((Test-Path "$dirPath\$($file.SOURCE)")){
    Write-Host "File Exist $dirPath\$($file.SOURCE)";
  }
  else{
        Write-Host "File doesn't Exist $dirPath\$($file.SOURCE)";
  }
} 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...