xml - PowerShell - 从 XML 中提取数据,然后在目录中查找
问题描述
我希望我能得到一些非常需要的建议,以解决我几次放弃的工作。*注意我对当前的设计没有意见。
当前进程
我们通过我们的网站获取应用程序,一旦应用程序完成,就会创建一个以唯一 ID 作为名称的目录 - 然后创建一个具有另一个唯一 ID 的子目录。它们位于名为“应用程序”的父文件夹中</p>
在这个子目录中有一个文件列表;
- Application_Form.pdf(仅存在 1 个)
- Proof_of_address.jpg(申请人可以上传1-10张图片)
- Passport_Photo.jpg(申请人可以上传1-10张图片)
- Photo.jpg(申请人可以上传1-10张图片)
- Application.xml(仅存在 1 个)
我们目前有一个任务计划,每 5 分钟触发一个 .bat 脚本,它将“应用程序”目录中的每个文件夹移动到内部服务器。
我们经常遇到的问题是脚本并不关心这些目录中的文件,因此如果申请人正在上传文件,并不是所有文件都被拉过。
解决方案
创建一个 PowerShell 脚本;
- 从 applications.xml 中提取文件名
- 使用这些文件名是否存在“如果存在”。
- 如果目录中存在所有文件,则将顶级目录移动到内部服务器。
- 如果不存在,则跳过并转到下一个目录。
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 中的文件名。我设法得到了上述结果,但只是散装形式。如何将此列表拆分为单独的结果,以便我可以执行“如果存在”功能来检查上述文件的目录,如果上述所有文件都存在,则将应用程序中的顶级目录复制到内部服务器?
任何帮助将非常感激!
解决方案
你做对了。只需要再添加一个步骤即可将输出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)";
}
}
}
推荐阅读
- html - HTML Element/Div is narrowing in response to decreased screen width
- sql - 具有多个选择行的材质 UI 表
- leaflet - L.CRS.Simple 的传单最低缩放级别仍然太高
- reactjs - react-beautoful-dnd 中的目标 droppableId 问题。接收到错误的目标可丢弃 id
- r - 用一个命令提取矩阵的几个不同元素?
- flutter - PetitParser 和括号
- nexus - Nexus Blobstore.compact 任务失败
- url - 如何使用 Coldfusion 从referrer 中获取值
- c++ - C++自注册工厂,多参数构造函数
- javascript - 模块导出问题,无法导出对象