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

欢迎过来写感慨:
    提问题的正确方式(反面教材)
    http://www.bathome.net/viewthread.php?tid=51315

TOP

本帖最后由 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. call :getn !n! ss
  30. set sa=%%~c
  31. rem 保留"."后面的尾巴
  32. if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
  33. echo;!s1!="!ss!" %%d
  34. set $!n!=!ss!囧%%~c
  35. set #%%~c=!ss!
  36. set /a n+=1
  37. )
  38. )
  39. ) else (
  40. if defined s2 (echo;!s1!=%%b) else (echo;!s1!)
  41. )
  42. )
  43. ) >temp.txt
  44. set/a n-=1
  45. (
  46. for /f "tokens=*" %%a in (temp.txt) do (
  47. set str=%%a
  48. for /l %%1 in (0,1,!n!) do (
  49. for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
  50. set str=!str:@%%c=@%%b!
  51. set str=!str:#%%c=#%%b!
  52. )
  53. )
  54. echo;!str!
  55. )
  56. ) > 结果.txt
  57. type 结果.txt
  58. rem 查看有多少个更改
  59. set $
  60. pause
  61. exit /b
  62. rem 计算临名字,可加上前缀
  63. :getn
  64. (set L=%1
  65. set M=%1
  66. set %2=)
  67. :loop
  68. set /a M=L %% 26
  69. set %2=!%2!!ASC:~%M%,1!
  70. if !M! neq !L! set /a L=L/26&goto :loop
  71. goto :eof
复制代码

TOP

回复  smss


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

我先处理简单的再处理包含数组的,任何事都是由简入繁吧

TOP

本帖最后由 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>

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

回复 25# smss


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

评分人数

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

TOP

本帖最后由 smss 于 2019-5-23 11:21 编辑


回复 28# netbenton

中文乱码
首<? 被替换成了ï»
尾>被替换成了>=
肉眼可见错误

TOP

回复 27# smss
你试过这个会出现乱码?
后面加的过滤,改好了!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p "strFile=请拖入处理文本:"
  4. if not exist !strFile! (
  5. echo;"!strFile!" 文件不找不到!!
  6. exit /b
  7. )
  8. rem 定义用于命名的字符表
  9. set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  10. set n=0
  11. rem 例外情况定义
  12. set exception=Extra
  13. (
  14. for /f "tokens=1* delims==" %%a in (!strFile!) do (
  15. set s1=%%a
  16. set s2=%%b
  17. if "!s1:%exception%=!!s1:~-5!" == "!s1! name" (
  18. for /f "tokens=1*" %%c in ("%%b") do (
  19. call :getn !n! ss
  20. set sa=%%~c
  21. rem 保留"."后面的尾巴
  22. if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
  23. echo;!s1!="!ss!" %%d
  24. set $!n!=!ss!囧%%~c
  25. set /a n+=1
  26. )
  27. ) else (
  28. echo;!s1!=%%b
  29. )
  30. )
  31. ) >temp.txt
  32. set/a n-=1
  33. (
  34. for /f "tokens=*" %%a in (temp.txt) do (
  35. set str=%%a
  36. for /l %%1 in (0,1,!n!) do (
  37. for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
  38. set str=!str:@%%c=@%%b!
  39. set str=!str:#%%c=#%%b!
  40. )
  41. )
  42. echo;!str!
  43. )
  44. ) > 结果.txt
  45. type 结果.txt
  46. rem 查看有多少个更改
  47. set $
  48. pause
  49. exit /b
  50. :getn 计算临名字,可加上前缀
  51. set L=%1
  52. set l1=%1
  53. set %2=
  54. :loop
  55. set /a M=L %% 26
  56. set %2=!ASC:~%M%,1!!%2!
  57. if !L1! neq !L! set /a L=L/26&goto :loop
  58. goto :eof
复制代码
1

评分人数

TOP

回复 26# netbenton
感谢你的热情回复
这个用BAT处理中文会乱码 而且后边加的过滤条件 貌似有点难以做到

TOP

1,只检查第一个等号是否是name="xxxxx",作为要改的名字,
2,所有@和#对应的字符串都会匹配更改
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p "strFile=请拖入处理文本:"
  4. if not exist !strFile! (
  5. echo;"!strFile!" 文件不找不到!!
  6. exit /b
  7. )
  8. rem 定义用于命名的字符表
  9. set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  10. set n=0
  11. (
  12. for /f "tokens=1* delims==" %%a in (!strFile!) do (
  13. set s1=%%a
  14. set s2=%%b
  15. if "!s1:~-5!" == " name" (
  16. for /f "tokens=1*" %%c in ("%%b") do (
  17. call :getn !n! ss
  18. echo;!s1!="!ss!" %%d
  19. set $!n!=!ss!囧%%~c
  20. set /a n+=1
  21. )
  22. ) else (
  23. echo;!s1!=%%b
  24. )
  25. )
  26. ) >temp.txt
  27. set/a n-=1
  28. (
  29. for /f "tokens=*" %%a in (temp.txt) do (
  30. set str=%%a
  31. for /l %%1 in (0,1,!n!) do (
  32. for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
  33. set str=!str:@%%c=@%%b!
  34. set str=!str:#%%c=#%%b!
  35. )
  36. )
  37. echo;!str!
  38. )
  39. ) > 结果.txt
  40. type 结果.txt
  41. rem 查看有多少个更改
  42. set $
  43. pause
  44. exit /b
  45. :getn 计算临名字,可加上前缀
  46. set L=%1
  47. set l1=%1
  48. set %2=
  49. :loop
  50. set /a M=L %% 26
  51. set %2=!ASC:~%M%,1!!%2!
  52. if !L1! neq !L! set /a L=L/26&goto :loop
  53. goto :eof
复制代码

TOP

本帖最后由 smss 于 2019-5-23 11:20 编辑

回复 24# WHY
需要加入以下筛选
系统固定名称别替换
特点<Extra 例如<Extra name="ShowCameraWhenLocked" type="boolean" expression="1"/>
以下名称固定需过滤
name="music_prev"
name="music_display"
name="music_next"
name="music_play"
name="music_pause"
或许还有  最好说明下在哪添加过滤

以.animation .visibility结尾调用需要同步变更(同以# @开头调用)
例如<MusicControl y="#screen_height/2" name="music_control" autoShow="true" visibility="false" enableLyric="true" updateLyricInterval="100"> name="music_control"被替换成了name="A"
<Command target="music_control.animation" value="play"/>
<Command target="music_control.visibility" value="false" condition="not(#appear)" delay="500"/>
需替换成A.animation和A.visibility

TOP

回复 23# smss


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

TOP

本帖最后由 smss 于 2019-5-22 21:09 编辑

回复 22# WHY
现在才空下来测试
中文全部乱码无法用 建议使用昨天那个加入判断和筛选 即可
  1. $global:n = 65; $h = @{};
  2. $s = [IO.File]::ReadAllText('manifest.txt', [Text.Encoding]::Default);
  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('manifest.xml', $s, [Text.Encoding]::UTF8);
复制代码
这个含中文不乱码 XML中含有数组的代码被替换后无法工作

TOP

回复 19# smss


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

TOP

本帖最后由 523066680 于 2019-5-23 11:45 编辑

NULL

TOP

返回列表