[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 WHY 于 2019-5-22 15:10 编辑

test.bat
  1. @echo off
  2. PowerShell "$h=@{};$s=[regex]::Replace([IO.File]::ReadAllText('a.txt',[Text.Encoding]::Default),'(?<=\bname=\")[^^\"]+(?=\")',{param($m);$a=$m.Value;if(!$h.ContainsKey($a)){$x=[Math]::floor($global:n/26);if(!$x){$c=''}else{$c=[char](64+[int]$x)};$h[$a]=$c+[char](65+$global:n++%%26)};$h[$a]});$s=[regex]::Replace($s, '(?^<=\")[^\"@#]*[@#][^^\"]+(?=\")',{param($m);$a=$m.Value;forEach($k In $h.Keys){$a=$a.Replace('@'+$k,'@'+$h[$k]).Replace('#'+$k,'#'+$h[$k])};$a});sc b.txt -Value $s -Enc utf8"
  3. pause
复制代码
变量名范围:A~Z、AA~ZZ,应该够用
1

评分人数

    • smss: 技术大牛技术 + 1

TOP

回复 13# smss


    我测试没有发现你所说的问题。请分别举例说明问题1,问题2

TOP

回复 19# smss


    有可能变量名超出26个英文字母范围,变成非字母变量名了,已修改。

TOP

回复 23# smss


    请举例说明:XML中含有数组的代码被替换后无法工作。
另外,我这里测试中文字符没有乱码,把 [Text.Encoding]::Default 改成 [Text.Encoding]::UTF8 试试

TOP

回复 25# smss


1. "XML中含有数组的代码被替换后无法工作" 这个问题你没有举例说明;
2. 中文字符乱码问题是否解决你没有交代;
3. 你应该事先总结好规律,哪些改哪些不改,怎么改,事先想好。
2

评分人数

    • 523066680: 辛苦了PB + 6 技术 + 1
    • smss: 这个修改也是个循序渐进的过程,不可能一下考 ...技术 + 1

TOP

本帖最后由 WHY 于 2019-5-25 12:32 编辑
  1. $global:n = 0; $Hash = @{};
  2. $str = [IO.File]::ReadAllText('a.txt',[Text.Encoding]::Default);
  3. #修改name属性的值,如果name属性值以music_prev或music_display或music_next等开头,或者节点名为Extra,则不修改
  4. #如果command与target同时出现,command="play",则修改target属性值,
  5. $reg1 = '(?<=<(?!Extra\s)[^<>]*\sname=")(?!music_(?:prev|display|next|play|pause))[^"]+(?=")';
  6. $reg2 = '(?<=\starget=")[^"]+(?="[^<>]*\scommand="play")|(?<=\scommand="play"[^<>]*\starget=")[^"]+(?=")';
  7. $str = [regex]::Replace($str, $reg1 + '|' + $reg2, {
  8.     param($m);
  9.     $key = $m.Value;
  10.     if( !$Hash.ContainsKey($key) ){
  11.         $x = [Math]::floor( $global:n / 26 );
  12.         if($x) { $chr1 = [char]( 64 + [int]$x ) } else { $chr1 = '' }
  13.         $Hash[$key] = $chr1 + [char]( 65 + $global:n++ % 26 );
  14.     }
  15.     $Hash[$key];
  16. })
  17. $arrKey = $Hash.Keys | sort -Desc {$_.Length};
  18. #如果属性值包含@#字符,或者属性值以 .animation或.visibility 结尾,则修改
  19. $str = [regex]::Replace($str, '(?<==")([^"@#]*[@#][^"]+|[^"]+(?:\.animation|\.visibility))(?=")', {
  20.     param($m);
  21.     $s = $m.Groups[1].Value;
  22.     forEach( $key In $arrKey ) {
  23.         $s = $s.Replace( '@' + $Key, '@' + $Hash[$Key] );
  24.         $s = $s.Replace( '#' + $Key, '#' + $Hash[$Key] );
  25.         $s = $s.Replace( $Key + '.animation', $Hash[$Key] + '.animation' );
  26.         $s = $s.Replace( $Key + '.visibility', $Hash[$Key] + '.visibility' );
  27.     }
  28.     $s;
  29. })
  30. [IO.File]::WriteAllText('b.txt', $str, [Text.Encoding]::UTF8);
  31. echo 'Done';
  32. [Console]::ReadKey()
复制代码
1

评分人数

    • smss: 太好啦 我来测试下能正常不技术 + 1

TOP

回复 32# smss


    已修改,如果还有问题,请其他高手解答。

TOP

本帖最后由 WHY 于 2019-5-25 12:45 编辑

回复 50# smss


    在 echo 'Done' 上面,插入三行:
  1. $str = [IO.File]::ReadAllText('c.txt', [Text.Encoding]::Default);
  2. $str = [regex]::Replace($str, '(?<=\sid=")[^"]+(?=")', {param($m); if($Hash[$m.Value]){$Hash[$m.Value]}else{$m.Value}});
  3. [IO.File]::WriteAllText('d.txt', $str, [Text.Encoding]::UTF8);
复制代码

TOP

返回列表