Batch file 如何根据XMLStarlet的结果使用批处理脚本移动文件

Batch file 如何根据XMLStarlet的结果使用批处理脚本移动文件,batch-file,Batch File,在这种情况下,我每次都使用XMLStartSet来验证一堆XML文件,并希望执行进一步的操作 如果XML无效,请将文件移动到特定目录并在日志中打印 如果XML有效,请使用特定的时间戳重命名该文件,并将该文件移动到特定目录 到目前为止,我编写了以下脚本来实现基于XML验证结果的操作,但该脚本似乎不起作用。我相信使用两个for循环似乎会导致进一步的脚本无法按需要运行。有人能看看我该怎么做并提出建议吗 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET &

在这种情况下,我每次都使用XMLStartSet来验证一堆XML文件,并希望执行进一步的操作

  • 如果XML无效,请将文件移动到特定目录并在日志中打印
  • 如果XML有效,请使用特定的时间戳重命名该文件,并将该文件移动到特定目录
到目前为止,我编写了以下脚本来实现基于XML验证结果的操作,但该脚本似乎不起作用。我相信使用两个for循环似乎会导致进一步的脚本无法按需要运行。有人能看看我该怎么做并提出建议吗

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "xmlStarletLocation=D:\tools\xmlstarlet"
SET "SourceXMLDirectory=D:\PH01"
SET "SourceXML=ProductData.xml"
SET "SourceXSDDirectory=D:\dtd"
SET "InvalidXMLDirectory=D:\PH01Invalid"
SET "TargetXMLDirectory=D:\PH01_ISH"
SET "ArchiveDirectory=D:\PH01_saved"
SET "LogDirectory=D:\validationLogs"

:TIMESTAMP:
TIMEOUT 1 > NUL  
FOR /f "tokens=2 delims==" %%a IN ('wmic OS Get localdatetime /value') DO SET "dt=%%a"
SET "YY=%dt:~2,2%" & SET "YYYY=%dt:~0,4%" & SET "MM=%dt:~4,2%" & SET "DD=%dt:~6,2%"
SET "HH=%dt:~8,2%" & SET "Min=%dt:~10,2%" & SET "Sec=%dt:~12,2%"
SET "FullStamp=%YYYY%%MM%%DD%%HH%%Min%%Sec%"
SET "TargetFileName=ProductData%FullStamp%.xml"

:VALIDATOR:
CD %SourceXMLDirectory%
:VALIDATOR:
FOR  %%i in (*ProductData*.xml) DO (
    FOR /f "eol=: delims=" %%A IN ('%xmlStarletLocation%\xml val -e -s %SourceXSDDirectory%\ProductData.xsd %SourceXMLDirectory%\%%i') >>%LOGFILE% DO (SET "ln=%%A"
        IF "!ln:~-8!" == " invalid" (
            MOVE  "%SourceXMLDirectory%\%%i" "%InvalidXMLDirectory%\%%i"
            ECHO %%i Validation failed. Check %LogDirectory%\ProductDataLog.txt for the logs. 1>&2
        )if "!ln:~-6!" == " valid" (
            MOVE /y "%SourceXMLDirectory%\%%i" "%TargetXMLDirectory%\%TargetFileName%"
            ECHO File is valid and uploaded to %TargetXMLDirectory%
        )
    )
)
:EOF:
此时不允许使用>>

D:\cmd>CD D:\ProductExport
>> was unexpected at this time.
D:\ProductExport>        FOR /f "eol=: delims=" %A IN ('D:\tools\xmlstarlet\xml val -e -s D:\ProductData.xsd D:\ProductExport\%i') >>  DO (

为什么不将
:TIMESTAMP:
部分的全部内容替换为
For/F“EOL=L”%%G In(“%SystemRoot%\System32\wbem\WMIC.exe OS Get LocalDateTime”),如果不是“%%~xG”==“Set”TargetFileName=%TargetXMLDirectory%\ProductData%%~nG.xml”
,则使用powershell为/F“tokens=*”%i In获取格式化日期
('PowerShell-Command“&{Get Date-format'yyyyMMddHHmmss'}”)确实设置了“TargetFileName=ProductData%%~i.xml”
我也不相信这行末尾的空格是件好事,也使用双引号。
('%xmlStarletLocation%\xml“val-e-s”%SourceXSDDirectory%\ProductData.xsd”“%SourceXMLDirectory%\%i”“)
在这里提供的一些帮助下,我成功地完成了XSD验证。但是我现在被日志部分卡住了。有人抱怨说>>%LOGFILE%是个问题,目前不需要。有什么建议吗?这是我的代码:
:VALIDATOR:FOR%%I in(*ProductData*.xml)DO(FOR/f“eol=:delims=“%%A in(“%xmlStarletLocation%\xml val-e-s%SourceXSDDirectory%\ProductData.xsd%SourceXMLDirectory%\%i”)>%LOGFILE%DO(设置“ln=%A”IF“!ln:~-8!”==“无效”(移动“%SourceXMLDirectory%\%i”“%InvalidXMLDirectory%\%i”回显%%i验证失败。检查%LogDirectory%\ProductDataLog.txt以获取日志。1>&2)如果“!ln:~-6!”==“有效”(移动/y“%SourceXMLDirectory%\%%i”“%TargetXMLDirectory%\%TargetFileName%”回显文件有效并已上载到%TargetXMLDirectory%))
@Tester,我已将您上述评论中的代码添加到您的问题中。请删除该评论,然后更正我阅读的内容与您的实际代码之间的任何差异,包括换行符和空格。