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

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

本帖最后由 smss 于 2019-6-26 11:23 编辑

具体报酬:100元人民币
支付方式:支付宝微信转账
联系方式:QQ296578353
有效期限:功能实现之前

批量替换文本中的指定内容 文本类似以下
<Variable name="city_id" type="string" column="city_id"/>
<Variable name="weather_location" type="string" column="city_name"/>
<Variable name="weather_id" type="int" column="weather_type"/>
<Variable name="city_id" type="string" column="city_id"/>

<Text name="Qm" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="@city_id" marqueeSpeed="50" marqueeGap="2"/>
<Text name="QW" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="#weather_location" marqueeSpeed="50" marqueeGap="2"/>
<Text name="QA" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="#weather_id+#city_id" marqueeSpeed="50" marqueeGap="2"/>
需要把文本中
name="city_id"替换成name="A" name="weather_location"替换成name="B"以此类推顺序是从上到下 把每一个name=""中的名称替换为A B C D...如果超26字母那么就以AA AB AC...AAA AAB AAC...这种命名或类似你能想到不重名的方式来命名(但需要规避运算符号 如把一个名称替换成了*那么后边调用这个变量时就面临一个致命问题 #*+#-  使得代入不了运算  因此名称中不要出现运算符号 需要规避符号 +,-,*,/,%,**,|,||,=,==, !,not)
注意:如果名称出现2次以上 如name="city_id" 也需要把name="city_id"替换为name="A" 后续文本中如有关联那么也需要同步变更 特点是会在变量名前加#或@如下例子
希望得到如下文本
<Variable name="A" type="string" column="city_id"/>
<Variable name="B" type="string" column="city_name"/>
<Variable name="C" type="int" column="weather_type"/>
<Variable name="A" type="string" column="city_id"/>
<Text name="D" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="@A" marqueeSpeed="50" marqueeGap="2"/>
<Text name="E" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="#B" marqueeSpeed="50" marqueeGap="2"/>
<Text name="F" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="#C+#A" marqueeSpeed="50" marqueeGap="2"/>

注意textExp不是固定调用以上变量名的 x="100" y="300" color="#ababab" size="30" 都可以调用 如x="#city_id" 需要变更为x="#A"

1实现替换name="" 中名称,使其变为无意义的字母或其它任何你知道的不重名的方式 让他人无法根据名称直接得知用途
2如果一个名称多次出现如下相同名称 那么需要替换成相同名称

<VariableCommand name="time_count" type="number[]" index="0" expression="0" />
<VariableCommand name="time_count" type="number[]" index="1" expression="0" />
<VariableCommand name="time_count" type="number[]" index="2" expression="0" />
<VariableCommand name="time_count" type="number[]" index="3" expression="0" />
变成
<VariableCommand name="B" type="number[]" index="0" expression="0" />
<VariableCommand name="B" type="number[]" index="1" expression="0" />
<VariableCommand name="B" type="number[]" index="2" expression="0" />
<VariableCommand name="B" type="number[]" index="3" expression="0" />
3如果name="tms0" 变成name="A"后续调用时 如#tms0或@tms0要同步这个名称变为#A @A

以下文本测试时使用
  1. <Group x="540" y="483" w="#tms_w" align="center" pivotX="#tms_w/2" pivotY="0" scale="ifelse(#time_hour0}0,0.85,1)">
  2. <!-- 小时 -->
  3. <Time name="tms0" x="0" y="0" src="ToolsScreen_src/timing/number/number.png" space="2" formatExp="ifelse(#time_hour0}0,#time_hour0,'')+#time_hour1+#time_hour2+':'" visibility="(#time_hour0+#time_hour1+#time_hour2)}0"/>
  4. <!-- 分钟 : 秒 -->
  5. <Time name="tms1" x="#tms0.bmp_width" y="0" src="ToolsScreen_src/timing/number/number.png" space="2" formatExp="#time_minute1+#time_minute2+':'+#time_second1+#time_second2" />
  6. <!-- 毫秒 -->
  7. <Time name="milis1" x="#tms0.bmp_width+#tms1.bmp_width" y="0" src="ToolsScreen_src/timing/number/number.png" space="2" formatExp="'.'+#time_millisecond1+#time_millisecond2" />
  8. </Group>
  9. <Text x="540" y="425" align="center" size="30" color="#ffffff" text="最多计数4次哦" visibility="#timing_count==5" alpha="510*#start_ani"/>
  10. </Group>
  11. </Group>
  12. <Var name="time_count" type="number[]" size="4" const="true"/>
  13. <!-- #count_y_ani/2.06 -->
  14. <Array x="0" y="0+100*(1-#start_ani)+200-#count_y_ani/2.06" count="4" indexName="__count" alpha="510*#start_ani">
  15. <Group y="103*#__count" visibility="#__count{#timing_count*#start_ani">
  16. <!-- 序号 0-4 -->
  17. <Text x="245" y="984" size="27" color="#ffffff" textExp="'0'+int(#__count+1)"/>
  18. <!-- + 00:00.00 上次计时到本次间隔时间 -->
  19. <!-- <Text x="585" y="980" align="right" size="34" color="#ffffff" textExp="'+ '+'00:00.00'" alpha="180"/> -->
  20. <Text x="585" y="980" align="right" size="34" color="#ffffff" textExp="'+ '+int((#time_count[#__count]-#time_count[#__count-1])/1000%3600/60/10)+int((#time_count[#__count]-#time_count[#__count-1])/1000%3600/60%10)+':'+int((#time_count[#__count]-#time_count[#__count-1])/1000%60/10)+int((#time_count[#__count]-#time_count[#__count-1])/1000%60%10)+'.'+int((#time_count[#__count]-#time_count[#__count-1])/100%10)+int((#time_count[#__count]-#time_count[#__count-1])/10%10)" alpha="180"/>
  21. <!-- 本次计时时间:上次结束的时间+本次计次时间 -->
  22. <!-- <Text x="840" y="980" align="right" size="34" color="#ffffff" textExp="'02:30.25'" /> -->
  23. <Text x="840" y="980" align="right" size="34" color="#ffffff" textExp="int(#time_count[#__count]/1000%3600/60/10)+int(#time_count[#__count]/1000%3600/60%10)+':'+int(#time_count[#__count]/1000%60/10)+int(#time_count[#__count]/1000%60%10)+'.'+int(#time_count[#__count]/100%10)+int(#time_count[#__count]/10%10)"/>
  24. <Rectangle x="239" y="1047-1" w="646" h="2" fillColor="#ffffff" alpha="25" />
  25. </Group>
  26. </Array>
  27. <Var name="start_ani">
  28. <VariableAnimation name="startAni" initPause="true" loop="false">
  29. <AniFrame value="0" time="0" easeType="QuadEaseOut"/>
  30. <AniFrame value="1" time="300" easeType="QuadEaseOut"/>
  31. <AniFrame value="0" time="600" />
  32. <Triggers>
  33. <Trigger action="end" condition="#startAni.current_frame==600">
  34. <VariableCommand name="start_on" expression="0" persist="true"/>
  35. <VariableCommand name="start_pause" expression="0" persist="true"/>
  36. <VariableCommand name="time_count" type="number[]" index="0" expression="0" />
  37. <VariableCommand name="time_count" type="number[]" index="1" expression="0" />
  38. <VariableCommand name="time_count" type="number[]" index="2" expression="0" />
  39. <VariableCommand name="time_count" type="number[]" index="3" expression="0" />
  40. <VariableCommand name="timing_count" expression="0" persist="true" />
  41. </Trigger>
  42. </Triggers>
  43. </VariableAnimation>
  44. </Var>
  45. <Var name="count_y_ani">
  46. <VariableAnimation initPause="true" loop="false">
  47. <AniFrame value="#count_y_ani" time="0" easeType="QuadEaseOut"/>
  48. <AniFrame value="min(#timing_count,4)*103" time="300" easeType="QuadEaseOut"/>
  49. <AniFrame value="0" time="800"/>
  50. </VariableAnimation>
  51. </Var>
  52. <Group x="0" y="#count_y_ani/4.12" >
  53. <!-- 计次/停止(重置) -->
  54. <Image x="540-130*#start_ani" y="1420" pivotX="78" pivotY="78" align="center" alignV="center"  srcExp="'ToolsScreen_src/timing/'+ifelse(#start_pause==1,'Stop','count')+'.png'" visibility="#start_on==1"/>
  55. <Button x="540-130*#start_ani" y="1420" w="156" h="156" visibility="#start_on==1" align="center" alignV="center">
  56. <Pressed>
  57. <Image x="540-130*#start_ani" y="1420" src="ToolsScreen_src/timing/pressed.png" alpha="30" align="center" alignV="center"/>
  58. </Pressed>
  59. <Triggers>
  60. <!-- 计次 -->
  61. <Trigger action="up" condition="#start_pause==0">
  62. <VariableCommand name="timing_count" expression="min(#timing_count+1,5)" persist="true" />
  63. <VariableCommand name="time_count" type="number[]" index="#timing_count-1" expression="#Time_total" persist="true"/>
  64. <AnimationCommand target="count_y_ani" command="play(0,300)" />
  65. <VariableCommand name="time_count0" expression="#time_count[0]" persist="true"/>
  66. <VariableCommand name="time_count1" expression="#time_count[1]" persist="true"/>
  67. <VariableCommand name="time_count2" expression="#time_count[2]" persist="true"/>
  68. <VariableCommand name="time_count3" expression="#time_count[3]" persist="true"/>
  69. </Trigger>
  70. <!-- 停止(重置) -->
  71. <Trigger action="up" condition="#start_pause==1">
  72. <AnimationCommand target="count_y_ani" command="play(300,800)" />
  73. <AnimationCommand target="clock_minute_ani" command="play(0,500)" condition="#clock_minute_ani==0"/>
  74. <AnimationCommand target="start_ani" command="play(300,600)" condition="#start_ani==1"/>
  75. </Trigger>
  76. </Triggers>
  77. </Button>
  78. <!-- 开始/继续/暂停 -->
  79. <Image x="540+130*#start_ani" y="1420" pivotX="78" pivotY="78" align="center" alignV="center" srcExp="'ToolsScreen_src/timing/'+ifelse(#start_on==0||#start_pause==1,'start','pause')+'.png'" />
  80. <Button x="540+130*#start_ani" y="1420" w="156" h="156" align="center" alignV="center" >
  81. <Pressed>
  82. <Image x="540+130*#start_ani" y="1420" src="ToolsScreen_src/timing/pressed.png" align="center" alignV="center" alpha="30"/>
  83. </Pressed>
  84. <Triggers>
  85. <!-- 开始 -->
  86. <Trigger action="up" condition="#start_on==0">
  87. <VariableCommand name="start_on" expression="1" persist="true" delay="10"/>
  88. <VariableCommand name="Start_timing" expression="#time_sys" persist="true"/>
  89. <VariableCommand name="Time_total" expression="0" persist="true" />
  90. <AnimationCommand target="start_ani" command="play(0,300)" condition="#start_ani==0"/>
  91. </Trigger>
  92. <Trigger action="up" condition="#start_on==1">
  93. <!-- 继续 -->
  94. <VariableCommand name="Start_timing" expression="#time_sys" persist="true" condition="#start_pause==1"/>
  95. <!-- 暂停 -->
  96. <VariableCommand name="Time_total_pause" expression="#Time_total" persist="true" condition="#start_pause==0"/>
  97. <VariableCommand name="start_pause" expression="int(#start_pause+1)%2" persist="true" />
  98. </Trigger>
  99. </Triggers>
  100. </Button>
  101. <!-- 返回按钮 -->
  102. <Image x="540" y="1700" src="ToolsScreen_src/back.png" align="center" alignV="center" touchable="true" alpha="170+50*#back_flag">
  103. <Triggers>
  104. <Trigger action="down">
  105. <VariableCommand name="back_flag" expression="1"/>
  106. </Trigger>
  107. <Trigger action="up">
  108. <VariableCommand name="back_flag" expression="0"/>
  109. <AnimationCommand target="init_tools_ani" command="play(800,0)"  condition="#init_tools_ani==1"/>
  110. </Trigger>
  111. </Triggers>
  112. </Image>
  113. </Group>
  114. <Button w="1080" h="#screen_height" interceptTouch="true"/>
  115. </Group>
复制代码

本帖最后由 zaqmlp 于 2019-5-22 10:12 编辑
  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.         $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]));};$b});^
  31.             [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
  32.         };^
  33.     }
  34. pause
复制代码
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 2# zaqmlp
只实现了替换变量名

TOP

本帖最后由 smss 于 2019-5-22 10:44 编辑
zaqmlp 发表于 2019-5-21 22:54

上次那代码可以换名称 你改后 就一片红了

TOP

回复 4# smss

加我q
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

正则处理由sed来完成,故运行时请确保系统内有sed命令。
  1. @if (0)==(0) echo off
  2. setlocal enabledelayedexpansion
  3. pushd %~dp0
  4. REM 取得名称列表
  5. set "strDict="
  6. set "nCount=0"
  7. set /p "strFile=请拖入处理文本:"
  8. set "strFile=!strFile:"=!"
  9. set "strFilter1=name=.[^^\"]*."
  10. set "strFilter2=.*name=\"\([^^\"]*\)\".*$"
  11. for /f "tokens=*" %%i in ('sed -n "/!strFilter1!/{s/!strFilter2!/\1/;p}" "!strFile!"') do (
  12. set "strTmpName=%%i"
  13. echo,!strDict! | findstr /i "!strTmpName!" >nul 2>nul && (
  14. REM 有字典存在,跳过
  15. ) || (
  16. REM 无字典,添加记录
  17. set /a "nCount+=1"
  18. set "strDict=!strDict!(!strTmpName!)"
  19. )
  20. )
  21. echo,总共存在变量 !nCount! 个
  22. set "nChar=64"
  23. set "strRegExp="
  24. for /l %%i in (1 1 !nCount!) do (
  25. set /a "nChar+=1"
  26. for /f "tokens=*" %%j in ('cscript -nologo -e:jscript %~s0 GetCharFromCode !nChar!') do set "strChar=%%j"
  27. call :_GetParm %%i
  28. )
  29. echo,替换变量正则表达式为 :
  30. echo,!strRegExp!
  31. echo,&echo,
  32. REM 进行关键内容替换
  33. for /f "tokens=*" %%i in ('echo,!strFile!') do set "strNewFile=%%~dpni_rep%%~xi"
  34. >"!strNewFile!" sed "!strRegExp!" "!strFile!"
  35. type "!strNewFile!"
  36. pause
  37. goto :EOF
  38. :_GetParm
  39. (
  40. for /f "tokens=%~1 delims=()" %%a in ('echo,!strDict!') do (
  41. echo,第 %%i 个变量 : %%a ==^> !strChar!
  42. set "strRegExp=!strRegExp!s/%%a/!strChar!/g;"
  43. )
  44. goto :EOF
  45. )
  46. @end
  47. var fun = WScript.Arguments(0);
  48. switch (fun) {
  49. case "GetCharFromCode":
  50. var nChar = parseInt(WScript.Arguments(1));
  51. GetCharFromCode(nChar);
  52. break;
  53. default:;
  54. }
  55. function GetCharFromCode(nChar) {
  56. WScript.Echo(String.fromCharCode(nChar));
  57. }
复制代码
echo,hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com

TOP

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

回复 6# amwfjhh
Win10怎样安装这个??

TOP

本帖最后由 smss 于 2019-5-22 00:53 编辑

回复 7# WHY 写的太棒了
有个小问题可以处理下吗 就是其中有数组时共用同一个名称是要替换成同名称的 虽然也替换成同名了 单生成的XTX文本 可以被读取 但部分功能不在
说明 混编时还是有问题

TOP

回复 8# smss


    就是单个sed.exe程序,论坛也能搜得到。很好下载的。玩批处理的或多或少都要用到正则表达式,各种语言中也有支持的,不过支持的程度不一样,sed是对正则支持比较全面的一个工具了。
下载下来后直接放到批处理同级目录即可调用,或者将其拷到系统PATH路径下(比如c:\windows),则任意目录下都可以调用它。
echo,hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com

TOP

回复 10# amwfjhh

哥楼上有更好更简短有力的代码 而且我已支付给了1楼一半的钱

不过我更倾向于WHY的方法 化繁为简 效率高

TOP

回复 11# smss


    嗯,无所谓,不同的实现方式,WHY兄用powershell,本身对各种对象支持就要好些,写出的代码也更简捷,而且代码中正则表达式过滤条件也要好些,没毛病。
echo,hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com

TOP

回复 7# WHY

有如下几个问题
1.名称中不要出现运算符号 如name="call_name1" 居然替换成了*或/

需要规避符号 +,-,*,/,%,**,|,||,=,==, !,not

2数组不能使用或许是上个问题导致

TOP

本帖最后由 523066680 于 2019-5-23 11:46 编辑
  1. use Mojo::DOM;
  2. use File::Slurp;
  3. my $xml = read_file( "test.xml" );
  4. my $dom = Mojo::DOM->new->xml(1)->parse( $xml );
  5. my @code = ('A' .. 'ZZZ');
  6. for my $e ( $dom->find("Variable")->each ) {
  7.     my $k = $e->attr("name");
  8.     $h{$k} = $code[$id++] unless (exists $h{$k});
  9.     $e->attr("name" => $h{$k} );
  10. }
  11. for my $e ( $dom->find("Text")->each ) {
  12.     my $exp = $e->attr("textExp");
  13.     $exp =~s/([\@\#])([\w\_]+)/$1$h{$2}/g;
  14.     $e->attr("textExp"=>$exp);
  15. }
  16. printf "%s\n", $dom;
复制代码
  1. <Variable column="city_id" name="A" type="string" />
  2. <Variable column="city_name" name="B" type="string" />
  3. <Variable column="weather_type" name="C" type="int" />
  4. <Variable column="city_id" name="A" type="string" />
  5. <Text alignV="center" color="#ababab" marqueeGap="2" marqueeSpeed="50" name="Qm" size="30" textExp="@A" w="458" x="100" y="300" />
  6. <Text alignV="center" color="#ababab" marqueeGap="2" marqueeSpeed="50" name="QW" size="30" textExp="#B" w="458" x="100" y="300" />
  7. <Text alignV="center" color="#ababab" marqueeGap="2" marqueeSpeed="50" name="QA" size="30" textExp="#C+#A" w="458" x="100" y="300" />
复制代码

TOP

回复 14# 523066680


    python?
echo,hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com

TOP

返回列表