尝试仅使用本机 Batch 函数编辑 XML 几乎是不可能完成的任务。像 xidel 这样的 XML 解析器会为您省去很多麻烦!
xidel -s LogConfig_BP.xml -e "serialize(x:replace-nodes(//FileDefinition[last()],function($x){$x,if ($x[@OrderNum='14']) then () else <FileDefinition OrderNum='14' Directory='TRACE' PurgeInSubdirectories='Yes' DeleteEmptySubDirs='Yes' FilePattern='*' PastFilesOlderThan='28day'/>}),{'indent':true()})" --output-declaration="<?xml version='1.0'?>"
<?xml version='1.0'?>
<PastFiles Iterations="1" MaxTimeFrame="20min">
<FileDefinition OrderNum="1" Directory="LOG" PurgeInSubdirectories="No" FilePattern=".\. 
 (txt|log|html|xml|csv)" MaxSize="10MB" PastFilesOlderThan="10day"/>
<FileDefinition OrderNum="14" Directory="TRACE" PurgeInSubdirectories="Yes" DeleteEmptySubDirs="Yes" FilePattern="*" PastFilesOlderThan="28day"/>
</PastFiles>
美化查询以获得更好的可读性(以及必要的转义字符):
xidel -s LogConfig_BP.xml -e ^"^
serialize(^
x:replace-nodes(^
//FileDefinition[last()],^
function($x){^
$x,^
if ($x[@OrderNum='14']) then ()^
else ^<FileDefinition OrderNum='14' Directory='TRACE' PurgeInSubdirectories='Yes' DeleteEmptySubDirs='Yes' FilePattern='*' PastFilesOlderThan='28day'/^>^
}^
),^
{'indent':true()}^
)^
" --output-declaration="<?xml version='1.0'?>"
您也可以使用computed constructors 并让serialize() 处理输出声明:
xidel -s LogConfig_BP.xml -e "serialize(x:replace-nodes(//FileDefinition[last()],function($x){$x,if ($x[@OrderNum='14']) then () else element FileDefinition {attribute OrderNum {'14'}, attribute Directory {'TRACE'}, attribute PurgeInSubdirectories {'Yes'}, attribute DeleteEmptySubDirs {'Yes'}, attribute FilePattern {'*'}, attribute PastFilesOlderThan {'28day'}}}),{'indent':true(),'omit-xml-declaration':false()})"
<?xml version="1.0" encoding="UTF-8"?>
<PastFiles Iterations="1" MaxTimeFrame="20min">
<FileDefinition OrderNum="1" Directory="LOG" PurgeInSubdirectories="No" FilePattern=".\. 
 (txt|log|html|xml|csv)" MaxSize="10MB" PastFilesOlderThan="10day"/>
<FileDefinition OrderNum="14" Directory="TRACE" PurgeInSubdirectories="Yes" DeleteEmptySubDirs="Yes" FilePattern="*" PastFilesOlderThan="28day"/>
</PastFiles>
xidel -s LogConfig_BP.xml -e ^"^
serialize(^
x:replace-nodes(^
//FileDefinition[last()],^
function($x){^
$x,^
if ($x[@OrderNum='14']) then^
()^
else^
element FileDefinition {^
attribute OrderNum {'14'},^
attribute Directory {'TRACE'},^
attribute PurgeInSubdirectories {'Yes'},^
attribute DeleteEmptySubDirs {'Yes'},^
attribute FilePattern {'*'},^
attribute PastFilesOlderThan {'28day'}^
}^
}^
),^
{'indent':true(),'omit-xml-declaration':false()}^
)^
"
还可以查看Xidel online tester。