Board logo

标题: [其他] 批处理如何替换XML文件N个节点里某个值为指定范围内的随机数? [打印本页]

作者: vipid    时间: 2021-9-24 22:11     标题: 批处理如何替换XML文件N个节点里某个值为指定范围内的随机数?

请教如何替换XML文件N个节点里某个值为指定范围内的随机数?
举个例子就像这样,其中这样的条目有N个,请教如何将<ccd id="*"的值全部替换为1-18内某个随机数?就是说最终所有的ccd id的值是随机1-18里任意的值。谢谢大家,弄完这个得系统的学习BAT了
<?xml version="1.0" encoding="UTF-8"?>

    <ccd name="baidu">
      <ccd id="12" name="baidu"/>
    </ccd>
       
    <ccd name="taobao">
      <ccd id="12" name="taobao"/>
    </ccd>

    <ccd name="google">
      <ccd id="12" name="google"/>
    </ccd>
作者: idwma    时间: 2021-9-24 22:25

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-3* delims== " %%i in (111.xml) do (
  4. if "%%i"=="<ccd" (
  5. set /a r=!random!%%18+1
  6. echo %%i %%j="!r!" %%l
  7. ) else (echo %%i %%j=%%k %%l)
  8. )
  9. pause
复制代码

作者: vipid    时间: 2021-9-24 22:36

回复 2# idwma

谢谢兄弟!这就来试试
作者: vipid    时间: 2021-9-24 22:49

本帖最后由 vipid 于 2021-9-24 22:51 编辑

回复 2# idwma


    好兄弟,里面的值好像没变
作者: qixiaobin0715    时间: 2021-9-25 11:07

回复 1# vipid
像这样处理文本的求助帖,应当注意以下几点:
1.最佳应当是提供测试文本,论坛不能发附件,可考虑发到网盘上;
2.如果不方便的发送文本文件,在论坛中提供文本内容也可,但要注意提供的文本内容片段最好从源文件中直接复制,必须具有代表性。
3.直接提供文本内容片段时,注意要说明源文本文件的编码方式。
我觉的你提供的文本片段不是直接复制而来,并且后来觉得不准确还修改过,没有说明源文件编码方式。
作者: xczxczxcz    时间: 2021-9-25 13:46

给你来一个,会不会用你自己查
  1. $file = ".\aa.xml";
  2. $xml = [Xml.XmlDocument]::new();
  3. $xml.Load($file);
  4. $nums = [Collections.Generic.List[int]](1..18);
  5. $xml.SelectNodes("//ccd").Where{if($_.HasAttribute("id")){
  6. if($nums.Count -gt 1){
  7. $index = (Get-Random $(0..($nums.Count-1)));
  8. $_.id = $nums[$index].ToString('d2');
  9. $nums.RemoveAt($index);
  10. }elseif($nums.Count -eq 1){
  11. $_.id = $nums[0].ToString('d2');
  12. $nums.RemoveAt(0);
  13. }else{$_.id = "Error"}
  14. }}
  15. $xml.Save($file);
  16. Pause;
复制代码

作者: vipid    时间: 2021-9-25 18:25

本帖最后由 vipid 于 2021-9-25 18:39 编辑
给你来一个,会不会用你自己查
xczxczxcz 发表于 2021-9-25 13:46



    感谢版主!这个程序还真看不懂,能不能来个BAT的?
作者: vipid    时间: 2021-9-25 18:40

感谢版主!这个程序还真看不懂,能不能来个BAT的?
作者: Batcher    时间: 2021-9-25 21:31

回复 7# vipid


参考:怎样执行 PowerShell 代码?
http://bbs.bathome.net/thread-31071-1-1.html
作者: qixiaobin0715    时间: 2021-9-26 08:37

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('findstr /n .* test.xml') do (
  4.     set "str=%%i"
  5.     set "str=!str:*:=!"
  6.     set "str1=!str:*<=!"
  7.     if "!str1:~,6!"=="ccd id" (
  8.         set /a num=!random!%%18+1
  9.         echo,      ^<ccd id="!num!" !str1:*" =!
  10.     ) else (
  11.         echo,!str!
  12.     )
  13. )
  14. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2