找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: smss

100元人民币 求bat或Powershell处理文本内容【已解决】

  [复制链接]
发表于 2019-5-23 11:23:53 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
smss + 1 太好啦 我来测试下能正常不

查看全部评分

 楼主| 发表于 2019-5-23 13:03:46 | 显示全部楼层
本帖最后由 smss 于 2019-5-23 15:12 编辑

回复 31# WHY
目前有这么个问题 当名字后有个数字时无法正确替换 如图

下面name="BallAniAlpha"已替换为name="EE" alpha="#BallAniAlpha*255"却被替换成了alpha="#EFAlpha*255" 应该为alpha="#EE*255"

例子<AnimationCommand target="BallAniAlpha" command="play"/>需替换为<AnimationCommand target="EE" command="play"/> 特点是包含command="play"target="变量名"

<Var name="BallAni" >被替换成了EF alpha="#BallAniAlpha*255"却被替换成了alpha="#EFAlpha*255"


还有一个是 文本c中关联文本a中变量名,希望也同步替换,生成文本d
文本c特点如下 id="Paper"  如果文本a中的 name="Paper"替换成了name="A" 那么文本c中id="Paper" 也需同步变更为id="A"
<Config>
<Group text="功能选项">
<CheckBox text="随机壁纸" summary="" id="Paper" default="1"/>
<CheckBox text="系统壁纸" summary="" id="Using" default="0"/>
<CheckBox text="重力壁纸" summary="" id="bg" default="0"/>
</Group>
</Config>
 楼主| 发表于 2019-5-23 15:09:53 | 显示全部楼层
回复  smss


1. "XML中含有数组的代码被替换后无法工作" 这个问题你没有举例说明;
2. 中文字符乱码问 ...
WHY 发表于 2019-5-23 11:22

我先处理简单的再处理包含数组的,任何事都是由简入繁吧
发表于 2019-5-23 15:15:25 | 显示全部楼层
本帖最后由 netbenton 于 2019-5-23 16:11 编辑

1,编码问题已经解决,批处理文本和要处理的文本必须是使用相同的编码
2,多出的“=“号问题已经解决
3,可指定例外固定的字符串列表
  1. goto :ansi
  2. rem UTF-8 编码支持
  3. chcp 65001
  4. cls

  5. :ansi
  6. @echo off


  7. setlocal enabledelayedexpansion


  8. set /p "strFile=请拖入处理文本:"
  9. if not exist !strFile! (
  10.         echo;"!strFile!" 文件不找不到!!
  11.         exit /b
  12. )

  13. rem 定义用于命名的字符表
  14. set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  15. set n=0

  16. rem 例外情况定义
  17. set exception=Extra Button

  18. (
  19. for /f "tokens=1* delims==" %%a in (!strFile!) do (
  20.         set s1=%%a
  21.         set s2=%%b
  22.         set z=
  23.         for %%k in (%exception%) do (if "!s1:%%k=!" neq "!s1!" (set z=y))
  24.         if "!z!!s1:~-5!" equ " name" (

  25.                 for /f "tokens=1*" %%c in ("%%b") do (
  26.                         if defined #%%~c (
  27.                                 echo;!s1!="!#%%~c!" %%d
  28.                         ) else (
  29.                                
  30.                                 call        :getn !n! ss
  31.                                 set sa=%%~c
  32.                        
  33.                                 rem 保留"."后面的尾巴
  34.                                 if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!

  35.                                 echo;!s1!="!ss!" %%d
  36.                                 set $!n!=!ss!囧%%~c
  37.                                 set #%%~c=!ss!
  38.                                 set /a n+=1
  39.                         )
  40.                 )
  41.        
  42.         ) else (
  43.                 if defined s2 (echo;!s1!=%%b) else (echo;!s1!)
  44.         )

  45. )
  46. ) >temp.txt

  47. set/a n-=1

  48. (
  49. for /f "tokens=*" %%a in (temp.txt) do (
  50.         set str=%%a
  51.         for /l %%1 in (0,1,!n!) do (
  52.                 for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
  53.                         set str=!str:@%%c=@%%b!
  54.                         set str=!str:#%%c=#%%b!
  55.                 )
  56.         )
  57.         echo;!str!
  58. )

  59. ) > 结果.txt

  60. type 结果.txt

  61. rem 查看有多少个更改

  62. set $

  63. pause

  64. exit /b

  65. rem 计算临名字,可加上前缀
  66. :getn

  67. (set L=%1
  68. set M=%1
  69. set %2=)

  70. :loop
  71. set /a M=L %% 26
  72. set %2=!%2!!ASC:~%M%,1!
  73. if !M! neq !L! set /a L=L/26&goto :loop
  74. goto :eof
复制代码
发表于 2019-5-23 15:37:27 | 显示全部楼层
回复 30# WHY

欢迎过来写感慨:
    提问题的正确方式(反面教材)
    http://www.bathome.net/viewthread.php?tid=51315
 楼主| 发表于 2019-5-23 15:52:27 | 显示全部楼层
本帖最后由 smss 于 2019-5-23 20:49 编辑

回复 34# netbenton
不要替换成运算符号 无法识别这个 效率是个大问题

PS 1~2秒 电脑好像没费什么事 BAT开了CPU和风扇都感觉有压力 可以想像 两者有很大差距的
还有我已支付 zaqmlp一半钱 但过程不完美 而且他还要加价 在期间还有中伤WHY代码因为没有加UTF8 而乱码的行为 而在那WHY发贴之前zaqmlp给的代码同样效率低下 因此放弃zaqmlp的任何方式方法
以下放上代码 有心可以比对 供交流 不涉及人身攻击 善恶自有分辨
WHY 5.22
  1. $global:n = 65; $h = @{};
  2. $s = [IO.File]::ReadAllText('manifest.xml', [Text.Encoding]::UTF8);
  3. $s = [regex]::Replace($s, '(?<=\bname=")[^"]+(?=")',{param($m);$a=$m.Value; if(!$h.ContainsKey($a)){$h[$a]=[char]($global:n++)}; $h[$a]});
  4. $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});
  5. [IO.File]::WriteAllText('manifest2.xml', $s, [Text.Encoding]::UTF8);
复制代码
WHY5.22 15:10
  1. @echo off
  2. PowerShell "$h=@{};$s=[regex]::Replace([IO.File]::ReadAllText('manifest.xml',[Text.Encoding]::UTF8),'(?<=\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
复制代码
WHY 5.23
  1. $global:n = 0; $Hash=@{};
  2. $str = [IO.File]::ReadAllText('manifest.xml',[Text.Encoding]::UTF8);

  3. #修改name属性的值
  4. #如果name属性的值以music_prev或music_display或music_next等开头,或者节点名为Extra,则排除
  5. $str = [regex]::Replace($str, '(?<=<(?!Extra)[^<>]*\sname=")(?!music_(?:prev|display|next|play|pause))[^"]+(?=")', {
  6.     param($m);
  7.     $key = $m.Value;
  8.     if( !$Hash.ContainsKey($key) ){
  9.         $x = [Math]::floor( $global:n / 26 );
  10.         if($x) { $chr1 = [char]( 64 + [int]$x ) } else { $chr1 = '' }
  11.         $Hash[$key] = $chr1 + [char]( 65 + $global:n++ % 26 );
  12.     }
  13.     $Hash[$key];
  14. })

  15. #如果属性值包含@#字符,或者属性值以 .animation或.visibility 结尾,则修改
  16. $str = [regex]::Replace($str, '(?<=")([^"@#]*[@#][^"]+|[^"]+(?:\.animation|\.visibility))(?=")', {
  17.     param($m);
  18.     $s = $m.Groups[1].Value;
  19.     forEach( $key In $Hash.Keys ) {
  20.         $s = $s.Replace( '@' + $key, '@' + $Hash[$key] );
  21.         $s = $s.Replace( '#' + $key, '#' + $Hash[$key] );
  22.         $s = $s.Replace( $key + '.animation', $Hash[$key] + '.animation' );
  23.         $s = $s.Replace( $key + '.visibility', $Hash[$key] + '.visibility' );
  24.     }
  25.     $s;
  26. })

  27. [IO.File]::WriteAllText('manifest2.xml', $str, [Text.Encoding]::UTF8);

  28. echo 'Done';
  29. [Console]::ReadKey()
复制代码
zaqmlp5.22
  1. @echo off
  2. cd /d "%~dp0"
  3. set "folder=结果"
  4. md "%folder%" 2>nul
  5. powershell -NoProfile -ExecutionPolicy bypass ^
  6.     $files=@(dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.xml')});^
  7.     $arr='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray();^
  8.     for($i=0;$i -lt $files.length;$i++){^
  9.         write-host $files[$i].Name;^
  10.         $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  11.         $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  12.         $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
  13.         $m=[regex]::matches($text,'name=""([^^""]+)""');^
  14.         $n=65;^
  15.         $newtext=$text;^
  16.         if($m.Count -ge 1){^
  17.             for($j=0;$j -lt $m.Count;$j++){^
  18.                 $kw=$m[$j].groups[0].value;^
  19.                 if(-not $dic.ContainsKey($kw)){^
  20.                     $c=@(get-random -input $arr -count 3) -join '';^
  21.                     while($list.ContainsKey($c)){$c=@(get-random -input $arr -count 3) -join '';};^
  22.                     $list.add($c,'');^
  23.                     $newtext=$newtext.replace($kw,'name="'+$c+'"');^
  24.                     $newtext=[regex]::replace($newtext,'(?^<==)""[^^""]+?""',{param($a);if($a.value.Contains($m[$j].groups[1].value)){$a.value.replace($m[$j].groups[1].value,$c);}else{$a.value}});^
  25.                     $dic.add($kw,[char]$n);^
  26.                     $n++;^
  27.                 };^
  28.             };^
  29.             [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name),  $newtext, [Text.Encoding]::UTF8);^
  30.         };^
  31.     }
  32. pause
复制代码
zaqmlp5.23
  1. @echo off
  2. cd /d "%~dp0"
  3. set "folder=结果"
  4. md "%folder%" 2>nul
  5. powershell -NoProfile -ExecutionPolicy bypass ^
  6.     $files=@(dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.xml')});^
  7.     $arr='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray();^
  8.     for($i=0;$i -lt $files.length;$i++){^
  9.         write-host $files[$i].Name;^
  10.         $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  11.         $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  12.         $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
  13.         $m=[regex]::matches($text,'name=""([^^""]+)""');^
  14.         $n=65;^
  15.         $newtext=$text;^
  16.         if($m.Count -ge 1){^
  17.             for($j=0;$j -lt $m.Count;$j++){^
  18.                 $kw=$m[$j].groups[0].value;^
  19.                 if(-not $dic.ContainsKey($kw)){^
  20.                     $c=@(get-random -input $arr -count 3) -join '';^
  21.                     while($list.ContainsKey($c)){$c=@(get-random -input $arr -count 3) -join '';};^
  22.                     $list.add($c,'');^
  23.                     $newtext=$newtext.replace($kw,'name="'+$c+'"');^
  24.                     $newtext=[regex]::replace($newtext,'(?^<==)""[^^""]+?""',{param($a);if($a.value.Contains($m[$j].groups[1].value)){$a.value.replace($m[$j].groups[1].value,$c);}else{$a.value}});^
  25.                     $dic.add($kw,[char]$n);^
  26.                     $n++;^
  27.                 };^
  28.             };^
  29.             [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name),  $newtext, [Text.Encoding]::UTF8);^
  30.         };^
  31.     }
  32. pause
复制代码
zaqmlp5.23
  1. @echo off
  2. cd /d "%~dp0"
  3. set "folder=结果"
  4. md "%folder%" 2>nul
  5. powershell -NoProfile -ExecutionPolicy bypass ^
  6.     $files=@(dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.xml')});^
  7.     $arr='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray();^
  8.     for($i=0;$i -lt $files.length;$i++){^
  9.         write-host $files[$i].Name;^
  10.         $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  11.         $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  12.         $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
  13.         $m=[regex]::matches($text,'(?^<!^<Extra )name=""([^^""]+)""');^
  14.         $newtext=$text;^
  15.         if($m.Count -ge 1){^
  16.             for($j=0;$j -lt $m.Count;$j++){^
  17.                 $kw=$m[$j].groups[1].value;^
  18.                 if(@('=','%%') -notcontains $kw){^
  19.                     if(-not $dic.ContainsKey($kw)){^
  20.                         $c=@(get-random -input $arr -count 3) -join '';^
  21.                         while($list.ContainsKey($c)){$c=@(get-random -input $arr -count 3) -join '';};^
  22.                         $list.add($c,'');^
  23.                         $newtext=$newtext.replace($m[$j].groups[0].value,'name="'+$c+'"');^
  24.                         $dic.add($kw,$c);^
  25.                         $n++;^
  26.                     };^
  27.                 };^
  28.             };^
  29.             $k=@($dic.keys^|sort {$_.length} -des);^
  30.             $newtext=[regex]::replace($newtext,'(?^<==)""[^^""]+?""',{param($a);$b=$a.value;foreach($it in $k){$b=$b.replace(('@'+$it),('@'+$dic[$it])).replace(('#'+$it),('#'+$dic[$it])).replace(($it+'.animation'),($dic[$it]+'.animation')).replace(($it+'.visibility'),($dic[$it]+'.visibility'));};$b});^
  31.             [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
  32.         };^
  33.     }
  34. pause
复制代码
发表于 2019-5-23 16:14:19 | 显示全部楼层
他这个多半是工作需求,商业用途,大概是抬高逆向门槛吧?
其中主要是 XML 的混淆。由于限制了批处理 和 PS,批处理正则不够强,还是 PS 划算。
但是即使用 PS,正则表达式要完美处理[后续可能产生的需求]也会让代码变得很复杂。所以建议是找一个 XML Parser(解析器)模块,PS肯定有,就是不知道需不需要额外安装。
让解析器去把XML变成数据结构,这样自由度就高了。

这样的问题,加价很合理啊。
 楼主| 发表于 2019-5-23 16:26:02 | 显示全部楼层
回复 38# 523066680
是的 降低可读性并不能彻底阻断逆向 还需加密 有个矛盾在解读时就必然要提供个解密器 这是双向的
目前有一可用JAVA工具是不能适用包含数组的文本 所以另寻方法
发表于 2019-5-23 16:37:25 | 显示全部楼层
回复 36# smss

“中伤”是你的用词,我只是说了会乱码的事实,而且你自己23楼也验证了;需求一再变动,加价很合理,买卖不成,仁义要在,你在这煽动情绪也没用
发表于 2019-5-23 16:38:46 | 显示全部楼层
  1. <Text name="QA">
复制代码
找到出现替换错误的原因了,"QA"之后不是空格,而是其它字符的时,会出错,以下代码已经处理好
  1. goto :ansi
  2. rem UTF-8 编码支持
  3. chcp 65001
  4. cls

  5. :ansi
  6. @echo off


  7. setlocal enabledelayedexpansion


  8. set /p "strFile=请拖入处理文本:"
  9. if not exist !strFile! (
  10.         echo;"!strFile!" 文件不找不到!!
  11.         exit /b
  12. )

  13. rem 定义用于命名的字符表
  14. set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  15. set n=0

  16. rem 例外情况定义
  17. set exception=Extra Button

  18. (
  19. for /f "tokens=1* delims==" %%a in (!strFile!) do (
  20.         set s1=%%a
  21.         set s2=%%b
  22.         set z=
  23.         for %%k in (%exception%) do (if "!s1:%%k=!" neq "!s1!" (set z=y))
  24.         if "!z!!s1:~-5!" equ " name" (
  25.                 set s3=!s2:^"= !
  26.                 for /f "tokens=1* delims= " %%c in ("!s3!") do (
  27.                         if defined #%%~c (
  28.                                 echo;!s1!="!#%%~c!" %%d
  29.                         ) else (
  30.                                
  31.                                 call        :getn !n! ss
  32.                                 set sa=%%~c
  33.                        
  34.                                 rem 保留"."后面的尾巴
  35.                                 if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!

  36.                                 echo;!s1!="!ss!" %%d
  37.                                 set $!n!=!ss!囧%%~c
  38.                                 set #%%~c=!ss!
  39.                                 set /a n+=1
  40.                         )
  41.                 )
  42.        
  43.         ) else (
  44.                 if defined s2 (echo;!s1!=%%b) else (echo;!s1!)
  45.         )

  46. )
  47. ) >temp.txt

  48. set/a n-=1

  49. (
  50. for /f "tokens=*" %%a in (temp.txt) do (
  51.         set str=%%a
  52.         for /l %%1 in (0,1,!n!) do (
  53.                 for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
  54.                         set str=!str:@%%c=@%%b!
  55.                         set str=!str:#%%c=#%%b!
  56.                 )
  57.         )
  58.         echo;!str!
  59. )

  60. ) > 结果.txt

  61. type 结果.txt

  62. rem 查看有多少个更改

  63. set $

  64. pause

  65. exit /b

  66. rem 计算临名字,可加上前缀
  67. :getn

  68. (set L=%1
  69. set M=%1
  70. set %2=)

  71. :loop
  72. set /a M=L %% 26
  73. set %2=!%2!!ASC:~%M%,1!
  74. if !M! neq !L! set /a L=L/26&goto :loop
  75. goto :eof
复制代码
 楼主| 发表于 2019-5-23 17:12:30 | 显示全部楼层
本帖最后由 smss 于 2019-5-23 17:22 编辑

回复 39# zaqmlp
你给代码出错 导致测试手机无法开机 我没有说什么 又质疑这方法不行 而且问到你应该怎样改一个筛选条件都不说的 说的前提是加钱的(建议你以后加行代码加次价钱) 你上来说别和你扯这个 那请问不扯这个我花钱请你做什么 请不要在我的帖子下留言了

只怪自己问题没有解决就先打钱
发表于 2019-5-23 17:31:40 | 显示全部楼层
回复 41# smss

事实你最初的方式就是不行呀,如果只按你最初的需求,替换后为什么你要一再变更需求,而且我让你找出替换后不对的地方,你一直跟我扯手机不行有什么用,你要告诉我哪里替换不对
发表于 2019-5-23 20:37:06 | 显示全部楼层
回复 35# 523066680

PS 可以完全操控 XML 按节点操作。问题是楼主问题不详。不敢写,没完没了。他自己都没有一个完整的修改方案出来。不让人家累死。
发表于 2019-5-23 20:43:18 | 显示全部楼层
回复 41# smss


    可以把你要解决的问题具有完整代表性发一份上来。还有完整的要求。本简单的事搞这么复杂。让大神们一次给你搞定。
 楼主| 发表于 2019-5-23 20:47:29 | 显示全部楼层
回复 44# xczxczxcz
关键问题是不可能一下子知道全部要做具体哪些 只能说个大概 然后在发现问题的地方排查
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:20 , Processed in 0.013083 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表