首页 > 解决方案 > PowerShell - 从 XML 中提取数据,然后在目录中查找

问题描述

我希望我能得到一些非常需要的建议,以解决我几次放弃的工作。*注意我对当前的设计没有意见。

当前进程

我们通过我们的网站获取应用程序,一旦应用程序完成,就会创建一个以唯一 ID 作为名称的目录 - 然后创建一个具有另一个唯一 ID 的子目录。它们位于名为“应用程序”的父文件夹中</p>

在这个子目录中有一个文件列表;

目录

我们目前有一个任务计划,每 5 分钟触发一个 .bat 脚本,它将“应用程序”目录中的每个文件夹移动到内部服务器。

我们经常遇到的问题是脚本并不关心这些目录中的文件,因此如果申请人正在上传文件,并不是所有文件都被拉过。

解决方案

创建一个 PowerShell 脚本;

  1. 从 applications.xml 中提取文件名
  2. 使用这些文件名是否存在“如果存在”。
  3. 如果目录中存在所有文件,则将顶级目录移动到内部服务器。
  4. 如果不存在,则跳过并转到下一个目录。

Applications.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 捕获 applications.xml 中的文件名。我设法得到了上述结果,但只是散装形式。如何将此列表拆分为单独的结果,以便我可以执行“如果存在”功能来检查上述文件的目录,如果上述所有文件都存在,则将应用程序中的顶级目录复制到内部服务器?

任何帮助将非常感激!

标签: xmlpowershell

解决方案


你做对了。只需要再添加一个步骤即可将输出Select-Xml转换为变量并像这样循环遍历它。

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)";
  }
} 

}

推荐阅读