Board logo

标题: [文本处理] 批处理修改不同文件中的递增序列时间 [打印本页]

作者: hoyu    时间: 2017-11-13 23:05     标题: 批处理修改不同文件中的递增序列时间

文件夹A下有子文件夹a1、a2、a3.....,每个子文件夹a1、a2、a3.....中都有同名xml文件b.xml,
每个b.xml文件中有多个时间节点,倒数第1个时间节点为   <Time>2017-11-13 T00:45:19.1870762+08:00</Time>。

现期望将a1文件夹中b.xml文件的倒数第1个时间节点修改为<Time>2017-11-13 T00:00:19.1870762+08:00</Time>
                a2文件夹中b.xml文件的倒数第1个时间节点修改为<Time>2017-11-13 T00:22:19.1870762+08:00</Time>
                a3文件夹中b.xml文件的倒数第1个时间节点修改为<Time>2017-11-13 T00:44:19.1870762+08:00</Time>
即后一个b.xml文件的倒数第1个时间节点比前一个增加22分钟,批处理如何实现?

附件 :文件夹A
作者: WHY    时间: 2017-11-15 16:52

本帖最后由 WHY 于 2017-11-15 21:41 编辑

PowerShell 代码,使用方法:保存为 test.ps1,右键单击 test.ps1,选择 "使用 PowerShell 运行"。
  1. $dtm = [DateTime]'2017-11-13 T00:00:19.1870762+08:00';
  2. $reg = '(?i)(?<=<Time>)[\S\s]*?(?=</Time>)';
  3. #遍历E:\a\a1,a2,a3...文件夹中的b.xml文件,以父文件夹名称排序
  4. $arr = dir 'E:\a\a*\b.xml' | sort{$_.Directory.Name.PadLeft(10,'0')};
  5. $arr | ForEach {
  6.     $fmt = '{0:s}{1:.fffffff}{2:zzz}' -f $dtm, $dtm, $dtm;     #日期格式化
  7.     $dtm = $dtm.AddMinutes(22);                                #日期递增22分钟
  8.     $str = [IO.File]::ReadAllText($_, [Text.Encoding]::UTF8);  #打开并读取文件内容
  9.     $offSet = [regex]::Match($str, $reg, 'RightToLeft').Index; #获取最后一个Time节点偏移值
  10.     $str = ([regex]$reg).Replace($str, $fmt, 1, $offSet);      #替换
  11.     [IO.File]::WriteAllText($_, $str, [Text.Encoding]::UTF8);  #保存文件
  12. }
复制代码
  1. $dtm = [DateTime]'2017-11-13 T00:00:19.1870762+08:00';
  2. $arr = dir E:\a\a*\b.xml | sort{$_.Directory.Name.PadLeft(10,'0')};
  3. $arr | ForEach {
  4.     $xml = [xml](type $_ -Encoding UTF8);
  5.     $fmt = '{0:s}{1:.fffffff}{2:zzz}' -f $dtm, $dtm, $dtm;
  6.     $dtm = $dtm.AddMinutes(22);
  7.     (Select-XML -xml $xml -XPath '//Time')[-1].Node.InnerText = $fmt;
  8.     $xml.save($_)
  9. }
复制代码





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