标题: 100元人民币 求bat或Powershell处理文本内容【已解决】 [打印本页]
作者: smss 时间: 2019-5-21 22:06 标题: 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
以下文本测试时使用- <Group x="540" y="483" w="#tms_w" align="center" pivotX="#tms_w/2" pivotY="0" scale="ifelse(#time_hour0}0,0.85,1)">
- <!-- 小时 -->
- <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"/>
- <!-- 分钟 : 秒 -->
- <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" />
- <!-- 毫秒 -->
- <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" />
- </Group>
- <Text x="540" y="425" align="center" size="30" color="#ffffff" text="最多计数4次哦" visibility="#timing_count==5" alpha="510*#start_ani"/>
- </Group>
- </Group>
- <Var name="time_count" type="number[]" size="4" const="true"/>
- <!-- #count_y_ani/2.06 -->
- <Array x="0" y="0+100*(1-#start_ani)+200-#count_y_ani/2.06" count="4" indexName="__count" alpha="510*#start_ani">
- <Group y="103*#__count" visibility="#__count{#timing_count*#start_ani">
- <!-- 序号 0-4 -->
- <Text x="245" y="984" size="27" color="#ffffff" textExp="'0'+int(#__count+1)"/>
- <!-- + 00:00.00 上次计时到本次间隔时间 -->
- <!-- <Text x="585" y="980" align="right" size="34" color="#ffffff" textExp="'+ '+'00:00.00'" alpha="180"/> -->
- <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"/>
- <!-- 本次计时时间:上次结束的时间+本次计次时间 -->
- <!-- <Text x="840" y="980" align="right" size="34" color="#ffffff" textExp="'02:30.25'" /> -->
- <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)"/>
- <Rectangle x="239" y="1047-1" w="646" h="2" fillColor="#ffffff" alpha="25" />
- </Group>
- </Array>
- <Var name="start_ani">
- <VariableAnimation name="startAni" initPause="true" loop="false">
- <AniFrame value="0" time="0" easeType="QuadEaseOut"/>
- <AniFrame value="1" time="300" easeType="QuadEaseOut"/>
- <AniFrame value="0" time="600" />
- <Triggers>
- <Trigger action="end" condition="#startAni.current_frame==600">
- <VariableCommand name="start_on" expression="0" persist="true"/>
- <VariableCommand name="start_pause" expression="0" persist="true"/>
- <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="timing_count" expression="0" persist="true" />
- </Trigger>
- </Triggers>
- </VariableAnimation>
- </Var>
- <Var name="count_y_ani">
- <VariableAnimation initPause="true" loop="false">
- <AniFrame value="#count_y_ani" time="0" easeType="QuadEaseOut"/>
- <AniFrame value="min(#timing_count,4)*103" time="300" easeType="QuadEaseOut"/>
- <AniFrame value="0" time="800"/>
- </VariableAnimation>
- </Var>
- <Group x="0" y="#count_y_ani/4.12" >
- <!-- 计次/停止(重置) -->
- <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"/>
- <Button x="540-130*#start_ani" y="1420" w="156" h="156" visibility="#start_on==1" align="center" alignV="center">
- <Pressed>
- <Image x="540-130*#start_ani" y="1420" src="ToolsScreen_src/timing/pressed.png" alpha="30" align="center" alignV="center"/>
- </Pressed>
- <Triggers>
- <!-- 计次 -->
- <Trigger action="up" condition="#start_pause==0">
- <VariableCommand name="timing_count" expression="min(#timing_count+1,5)" persist="true" />
- <VariableCommand name="time_count" type="number[]" index="#timing_count-1" expression="#Time_total" persist="true"/>
- <AnimationCommand target="count_y_ani" command="play(0,300)" />
- <VariableCommand name="time_count0" expression="#time_count[0]" persist="true"/>
- <VariableCommand name="time_count1" expression="#time_count[1]" persist="true"/>
- <VariableCommand name="time_count2" expression="#time_count[2]" persist="true"/>
- <VariableCommand name="time_count3" expression="#time_count[3]" persist="true"/>
- </Trigger>
- <!-- 停止(重置) -->
- <Trigger action="up" condition="#start_pause==1">
- <AnimationCommand target="count_y_ani" command="play(300,800)" />
- <AnimationCommand target="clock_minute_ani" command="play(0,500)" condition="#clock_minute_ani==0"/>
- <AnimationCommand target="start_ani" command="play(300,600)" condition="#start_ani==1"/>
- </Trigger>
- </Triggers>
- </Button>
- <!-- 开始/继续/暂停 -->
- <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'" />
- <Button x="540+130*#start_ani" y="1420" w="156" h="156" align="center" alignV="center" >
- <Pressed>
- <Image x="540+130*#start_ani" y="1420" src="ToolsScreen_src/timing/pressed.png" align="center" alignV="center" alpha="30"/>
- </Pressed>
- <Triggers>
- <!-- 开始 -->
- <Trigger action="up" condition="#start_on==0">
- <VariableCommand name="start_on" expression="1" persist="true" delay="10"/>
- <VariableCommand name="Start_timing" expression="#time_sys" persist="true"/>
- <VariableCommand name="Time_total" expression="0" persist="true" />
- <AnimationCommand target="start_ani" command="play(0,300)" condition="#start_ani==0"/>
- </Trigger>
- <Trigger action="up" condition="#start_on==1">
- <!-- 继续 -->
- <VariableCommand name="Start_timing" expression="#time_sys" persist="true" condition="#start_pause==1"/>
- <!-- 暂停 -->
- <VariableCommand name="Time_total_pause" expression="#Time_total" persist="true" condition="#start_pause==0"/>
- <VariableCommand name="start_pause" expression="int(#start_pause+1)%2" persist="true" />
- </Trigger>
- </Triggers>
- </Button>
- <!-- 返回按钮 -->
- <Image x="540" y="1700" src="ToolsScreen_src/back.png" align="center" alignV="center" touchable="true" alpha="170+50*#back_flag">
- <Triggers>
- <Trigger action="down">
- <VariableCommand name="back_flag" expression="1"/>
- </Trigger>
- <Trigger action="up">
- <VariableCommand name="back_flag" expression="0"/>
- <AnimationCommand target="init_tools_ani" command="play(800,0)" condition="#init_tools_ani==1"/>
- </Trigger>
- </Triggers>
- </Image>
- </Group>
- <Button w="1080" h="#screen_height" interceptTouch="true"/>
- </Group>
复制代码
作者: zaqmlp 时间: 2019-5-21 22:54
本帖最后由 zaqmlp 于 2019-5-22 10:12 编辑
- @echo off
- cd /d "%~dp0"
- set "folder=结果"
- md "%folder%" 2>nul
- powershell -NoProfile -ExecutionPolicy bypass ^
- $files=@(dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.xml')});^
- $arr='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray();^
- for($i=0;$i -lt $files.length;$i++){^
- write-host $files[$i].Name;^
- $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
- $m=[regex]::matches($text,'name=\""([^^\""]+)\""');^
- $newtext=$text;^
- if($m.Count -ge 1){^
- for($j=0;$j -lt $m.Count;$j++){^
- $kw=$m[$j].groups[1].value;^
- if(@('=','%%') -notcontains $kw){^
- if(-not $dic.ContainsKey($kw)){^
- $c=@(get-random -input $arr -count 3) -join '';^
- while($list.ContainsKey($c)){$c=@(get-random -input $arr -count 3) -join '';};^
- $list.add($c,'');^
- $newtext=$newtext.replace($m[$j].groups[0].value,'name=\"'+$c+'\"');^
- $dic.add($kw,$c);^
- $n++;^
- };^
- };^
- };^
- $k=@($dic.keys^|sort {$_.length} -des);^
- $newtext=[regex]::replace($newtext,'(?^<==)\""[^^\""]+?\""',{param($a);$b=$a.value;foreach($it in $k){$b=$b.replace(('@'+$it),('@'+$dic[$it])).replace(('#'+$it),('#'+$dic[$it]));};$b});^
- [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
- };^
- }
- pause
复制代码
作者: smss 时间: 2019-5-21 23:12
回复 2# zaqmlp
只实现了替换变量名
作者: smss 时间: 2019-5-21 23:37
本帖最后由 smss 于 2019-5-22 10:44 编辑
zaqmlp 发表于 2019-5-21 22:54
上次那代码可以换名称 你改后 就一片红了
作者: zaqmlp 时间: 2019-5-21 23:43
回复 4# smss
加我q
作者: amwfjhh 时间: 2019-5-22 00:17
正则处理由sed来完成,故运行时请确保系统内有sed命令。- @if (0)==(0) echo off
- setlocal enabledelayedexpansion
-
- pushd %~dp0
- REM 取得名称列表
- set "strDict="
- set "nCount=0"
-
- set /p "strFile=请拖入处理文本:"
- set "strFile=!strFile:"=!"
-
- set "strFilter1=name=.[^^\"]*."
- set "strFilter2=.*name=\"\([^^\"]*\)\".*$"
- for /f "tokens=*" %%i in ('sed -n "/!strFilter1!/{s/!strFilter2!/\1/;p}" "!strFile!"') do (
- set "strTmpName=%%i"
- echo,!strDict! | findstr /i "!strTmpName!" >nul 2>nul && (
- REM 有字典存在,跳过
- ) || (
- REM 无字典,添加记录
- set /a "nCount+=1"
- set "strDict=!strDict!(!strTmpName!)"
- )
- )
- echo,总共存在变量 !nCount! 个
- set "nChar=64"
- set "strRegExp="
- for /l %%i in (1 1 !nCount!) do (
- set /a "nChar+=1"
- for /f "tokens=*" %%j in ('cscript -nologo -e:jscript %~s0 GetCharFromCode !nChar!') do set "strChar=%%j"
- call :_GetParm %%i
- )
- echo,替换变量正则表达式为 :
- echo,!strRegExp!
- echo,&echo,
-
- REM 进行关键内容替换
- for /f "tokens=*" %%i in ('echo,!strFile!') do set "strNewFile=%%~dpni_rep%%~xi"
- >"!strNewFile!" sed "!strRegExp!" "!strFile!"
- type "!strNewFile!"
-
-
- pause
- goto :EOF
-
- :_GetParm
- (
- for /f "tokens=%~1 delims=()" %%a in ('echo,!strDict!') do (
- echo,第 %%i 个变量 : %%a ==^> !strChar!
- set "strRegExp=!strRegExp!s/%%a/!strChar!/g;"
- )
- goto :EOF
- )
- @end
-
- var fun = WScript.Arguments(0);
-
- switch (fun) {
- case "GetCharFromCode":
- var nChar = parseInt(WScript.Arguments(1));
- GetCharFromCode(nChar);
- break;
-
- default:;
- }
-
- function GetCharFromCode(nChar) {
- WScript.Echo(String.fromCharCode(nChar));
- }
复制代码
作者: WHY 时间: 2019-5-22 00:31
本帖最后由 WHY 于 2019-5-22 15:10 编辑
test.bat- @echo off
- 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"
- pause
复制代码
变量名范围:A~Z、AA~ZZ,应该够用
作者: smss 时间: 2019-5-22 00:32
回复 6# amwfjhh
Win10怎样安装这个??
作者: smss 时间: 2019-5-22 00:44
本帖最后由 smss 于 2019-5-22 00:53 编辑
回复 7# WHY 写的太棒了
有个小问题可以处理下吗 就是其中有数组时共用同一个名称是要替换成同名称的 虽然也替换成同名了 单生成的XTX文本 可以被读取 但部分功能不在
说明 混编时还是有问题
作者: amwfjhh 时间: 2019-5-22 00:50
回复 8# smss
就是单个sed.exe程序,论坛也能搜得到。很好下载的。玩批处理的或多或少都要用到正则表达式,各种语言中也有支持的,不过支持的程度不一样,sed是对正则支持比较全面的一个工具了。
下载下来后直接放到批处理同级目录即可调用,或者将其拷到系统PATH路径下(比如c:\windows),则任意目录下都可以调用它。
作者: smss 时间: 2019-5-22 00:57
回复 10# amwfjhh
哥楼上有更好更简短有力的代码 而且我已支付给了1楼一半的钱
不过我更倾向于WHY的方法 化繁为简 效率高
作者: amwfjhh 时间: 2019-5-22 01:08
回复 11# smss
嗯,无所谓,不同的实现方式,WHY兄用powershell,本身对各种对象支持就要好些,写出的代码也更简捷,而且代码中正则表达式过滤条件也要好些,没毛病。
作者: smss 时间: 2019-5-22 03:11
回复 7# WHY
有如下几个问题
1.名称中不要出现运算符号 如name="call_name1" 居然替换成了*或/
需要规避符号 +,-,*,/,%,**,|,||,=,==, !,not
2数组不能使用或许是上个问题导致
作者: 523066680 时间: 2019-5-22 08:50
本帖最后由 523066680 于 2019-5-23 11:46 编辑
- use Mojo::DOM;
- use File::Slurp;
- my $xml = read_file( "test.xml" );
- my $dom = Mojo::DOM->new->xml(1)->parse( $xml );
- my @code = ('A' .. 'ZZZ');
-
- for my $e ( $dom->find("Variable")->each ) {
- my $k = $e->attr("name");
- $h{$k} = $code[$id++] unless (exists $h{$k});
- $e->attr("name" => $h{$k} );
- }
-
- for my $e ( $dom->find("Text")->each ) {
- my $exp = $e->attr("textExp");
- $exp =~s/([\@\#])([\w\_]+)/$1$h{$2}/g;
- $e->attr("textExp"=>$exp);
- }
-
- printf "%s\n", $dom;
复制代码
- <Variable column="city_id" name="A" type="string" />
- <Variable column="city_name" name="B" type="string" />
- <Variable column="weather_type" name="C" type="int" />
- <Variable column="city_id" name="A" type="string" />
-
- <Text alignV="center" color="#ababab" marqueeGap="2" marqueeSpeed="50" name="Qm" size="30" textExp="@A" w="458" x="100" y="300" />
- <Text alignV="center" color="#ababab" marqueeGap="2" marqueeSpeed="50" name="QW" size="30" textExp="#B" w="458" x="100" y="300" />
- <Text alignV="center" color="#ababab" marqueeGap="2" marqueeSpeed="50" name="QA" size="30" textExp="#C+#A" w="458" x="100" y="300" />
复制代码
作者: amwfjhh 时间: 2019-5-22 08:54
回复 14# 523066680
python?
作者: smss 时间: 2019-5-22 10:32
回复 14# 523066680
感谢 这个应该怎样使用 我电脑中没有 不是BAT也不是PS?还要安装其它什么吗??
作者: WHY 时间: 2019-5-22 10:54
回复 13# smss
我测试没有发现你所说的问题。请分别举例说明问题1,问题2
作者: Batcher 时间: 2019-5-22 11:06
回复 16# smss
参考:怎样在Windows系统中搭建Python环境?
http://bbs.bathome.net/thread-15581-1-1.html
作者: smss 时间: 2019-5-22 13:10
本帖最后由 smss 于 2019-5-22 13:20 编辑
回复 17# WHY
昨天测试了zaqmlp的代码生成的文本在手机上试 手机是直接无法开机刷了一次ROM但锁屏数据还在 只好清数据再刷了次ROM
用BCompare比对原码和生成代码 还是发现不少问题的 目前看那方法 效率较低 自己看不懂这语言只好作罢
你给的方法是目前看到效率最高的 比对原码时变量名能被有效替换 后面关联时也可同步替换 但是有时会出错 我会截图你看
问题1例子 name="city_id"以下统称变量名 被替换成了XML中涉及的运算符号 当该变量名被调用运算时将可能出现 如name="city_id"替换成了name="+" name="city_id2"替换成了name="-"
后边调用这个时x="#city_id+#city_id2"将被替换成x="#++#-" 机器运算不了 这就尴尬啦
作者: zaqmlp 时间: 2019-5-22 13:27
已更新,试试
作者: 523066680 时间: 2019-5-22 14:41
本帖最后由 523066680 于 2019-5-23 11:45 编辑
NULL
作者: WHY 时间: 2019-5-22 15:13
回复 19# smss
有可能变量名超出26个英文字母范围,变成非字母变量名了,已修改。
作者: smss 时间: 2019-5-22 21:06
本帖最后由 smss 于 2019-5-22 21:09 编辑
回复 22# WHY
现在才空下来测试
中文全部乱码无法用 建议使用昨天那个加入判断和筛选 即可- $global:n = 65; $h = @{};
- $s = [IO.File]::ReadAllText('manifest.txt', [Text.Encoding]::Default);
- $s = [regex]::Replace($s, '(?<=\bname=")[^"]+(?=")',{param($m);$a=$m.Value; if(!$h.ContainsKey($a)){$h[$a]=[char]($global:n++)}; $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});
- [IO.File]::WriteAllText('manifest.xml', $s, [Text.Encoding]::UTF8);
复制代码
这个含中文不乱码 XML中含有数组的代码被替换后无法工作
作者: WHY 时间: 2019-5-22 21:57
回复 23# smss
请举例说明:XML中含有数组的代码被替换后无法工作。
另外,我这里测试中文字符没有乱码,把 [Text.Encoding]::Default 改成 [Text.Encoding]::UTF8 试试
作者: smss 时间: 2019-5-23 01:20
本帖最后由 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
作者: netbenton 时间: 2019-5-23 01:24
1,只检查第一个等号是否是name="xxxxx",作为要改的名字,
2,所有@和#对应的字符串都会匹配更改- @echo off
- setlocal enabledelayedexpansion
- set /p "strFile=请拖入处理文本:"
- if not exist !strFile! (
- echo;"!strFile!" 文件不找不到!!
- exit /b
- )
-
- rem 定义用于命名的字符表
- set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set n=0
-
-
- (
- for /f "tokens=1* delims==" %%a in (!strFile!) do (
- set s1=%%a
- set s2=%%b
- if "!s1:~-5!" == " name" (
-
- for /f "tokens=1*" %%c in ("%%b") do (
- call :getn !n! ss
- echo;!s1!="!ss!" %%d
- set $!n!=!ss!囧%%~c
- set /a n+=1
- )
-
- ) else (
- echo;!s1!=%%b
- )
-
- )
- ) >temp.txt
-
- set/a n-=1
-
- (
- for /f "tokens=*" %%a in (temp.txt) do (
- set str=%%a
- for /l %%1 in (0,1,!n!) do (
- for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
- set str=!str:@%%c=@%%b!
- set str=!str:#%%c=#%%b!
- )
- )
- echo;!str!
- )
-
- ) > 结果.txt
-
- type 结果.txt
-
- rem 查看有多少个更改
- set $
-
- pause
-
- exit /b
-
- :getn 计算临名字,可加上前缀
- set L=%1
- set l1=%1
- set %2=
- :loop
- set /a M=L %% 26
-
- set %2=!ASC:~%M%,1!!%2!
-
- if !L1! neq !L! set /a L=L/26&goto :loop
-
- goto :eof
复制代码
作者: smss 时间: 2019-5-23 01:48
回复 26# netbenton
感谢你的热情回复
这个用BAT处理中文会乱码 而且后边加的过滤条件 貌似有点难以做到
作者: netbenton 时间: 2019-5-23 02:06
回复 27# smss
你试过这个会出现乱码?
后面加的过滤,改好了!- @echo off
- setlocal enabledelayedexpansion
- set /p "strFile=请拖入处理文本:"
- if not exist !strFile! (
- echo;"!strFile!" 文件不找不到!!
- exit /b
- )
-
- rem 定义用于命名的字符表
- set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set n=0
-
- rem 例外情况定义
- set exception=Extra
-
- (
- for /f "tokens=1* delims==" %%a in (!strFile!) do (
- set s1=%%a
- set s2=%%b
-
- if "!s1:%exception%=!!s1:~-5!" == "!s1! name" (
-
- for /f "tokens=1*" %%c in ("%%b") do (
- call :getn !n! ss
- set sa=%%~c
-
- rem 保留"."后面的尾巴
- if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
-
- echo;!s1!="!ss!" %%d
- set $!n!=!ss!囧%%~c
- set /a n+=1
- )
-
- ) else (
- echo;!s1!=%%b
- )
-
- )
- ) >temp.txt
-
- set/a n-=1
-
- (
- for /f "tokens=*" %%a in (temp.txt) do (
- set str=%%a
- for /l %%1 in (0,1,!n!) do (
- for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
- set str=!str:@%%c=@%%b!
- set str=!str:#%%c=#%%b!
- )
- )
- echo;!str!
- )
-
- ) > 结果.txt
-
- type 结果.txt
-
- rem 查看有多少个更改
- set $
-
- pause
-
- exit /b
-
- :getn 计算临名字,可加上前缀
- set L=%1
- set l1=%1
- set %2=
- :loop
- set /a M=L %% 26
-
- set %2=!ASC:~%M%,1!!%2!
-
- if !L1! neq !L! set /a L=L/26&goto :loop
-
- goto :eof
复制代码
作者: smss 时间: 2019-5-23 11:08
本帖最后由 smss 于 2019-5-23 11:21 编辑
回复 28# netbenton
中文乱码
首<? 被替换成了ï»
尾>被替换成了>=
肉眼可见错误
作者: WHY 时间: 2019-5-23 11:22
回复 25# smss
1. "XML中含有数组的代码被替换后无法工作" 这个问题你没有举例说明;
2. 中文字符乱码问题是否解决你没有交代;
3. 你应该事先总结好规律,哪些改哪些不改,怎么改,事先想好。
作者: WHY 时间: 2019-5-23 11:23
本帖最后由 WHY 于 2019-5-25 12:32 编辑
- $global:n = 0; $Hash = @{};
- $str = [IO.File]::ReadAllText('a.txt',[Text.Encoding]::Default);
-
- #修改name属性的值,如果name属性值以music_prev或music_display或music_next等开头,或者节点名为Extra,则不修改
- #如果command与target同时出现,command="play",则修改target属性值,
- $reg1 = '(?<=<(?!Extra\s)[^<>]*\sname=")(?!music_(?:prev|display|next|play|pause))[^"]+(?=")';
- $reg2 = '(?<=\starget=")[^"]+(?="[^<>]*\scommand="play")|(?<=\scommand="play"[^<>]*\starget=")[^"]+(?=")';
-
- $str = [regex]::Replace($str, $reg1 + '|' + $reg2, {
- param($m);
- $key = $m.Value;
- if( !$Hash.ContainsKey($key) ){
- $x = [Math]::floor( $global:n / 26 );
- if($x) { $chr1 = [char]( 64 + [int]$x ) } else { $chr1 = '' }
- $Hash[$key] = $chr1 + [char]( 65 + $global:n++ % 26 );
- }
- $Hash[$key];
- })
-
- $arrKey = $Hash.Keys | sort -Desc {$_.Length};
-
- #如果属性值包含@#字符,或者属性值以 .animation或.visibility 结尾,则修改
- $str = [regex]::Replace($str, '(?<==")([^"@#]*[@#][^"]+|[^"]+(?:\.animation|\.visibility))(?=")', {
- param($m);
- $s = $m.Groups[1].Value;
- forEach( $key In $arrKey ) {
- $s = $s.Replace( '@' + $Key, '@' + $Hash[$Key] );
- $s = $s.Replace( '#' + $Key, '#' + $Hash[$Key] );
- $s = $s.Replace( $Key + '.animation', $Hash[$Key] + '.animation' );
- $s = $s.Replace( $Key + '.visibility', $Hash[$Key] + '.visibility' );
- }
- $s;
- })
-
- [IO.File]::WriteAllText('b.txt', $str, [Text.Encoding]::UTF8);
-
- echo 'Done';
- [Console]::ReadKey()
复制代码
作者: smss 时间: 2019-5-23 13:03
本帖最后由 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>
作者: smss 时间: 2019-5-23 15:09
回复 smss
1. "XML中含有数组的代码被替换后无法工作" 这个问题你没有举例说明;
2. 中文字符乱码问 ...
WHY 发表于 2019-5-23 11:22
我先处理简单的再处理包含数组的,任何事都是由简入繁吧
作者: netbenton 时间: 2019-5-23 15:15
本帖最后由 netbenton 于 2019-5-23 16:11 编辑
1,编码问题已经解决,批处理文本和要处理的文本必须是使用相同的编码
2,多出的“=“号问题已经解决
3,可指定例外固定的字符串列表- goto :ansi
- rem UTF-8 编码支持
- chcp 65001
- cls
-
- :ansi
- @echo off
-
-
- setlocal enabledelayedexpansion
-
-
- set /p "strFile=请拖入处理文本:"
- if not exist !strFile! (
- echo;"!strFile!" 文件不找不到!!
- exit /b
- )
-
- rem 定义用于命名的字符表
- set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set n=0
-
- rem 例外情况定义
- set exception=Extra Button
-
- (
- for /f "tokens=1* delims==" %%a in (!strFile!) do (
- set s1=%%a
- set s2=%%b
- set z=
- for %%k in (%exception%) do (if "!s1:%%k=!" neq "!s1!" (set z=y))
- if "!z!!s1:~-5!" equ " name" (
-
- for /f "tokens=1*" %%c in ("%%b") do (
- if defined #%%~c (
- echo;!s1!="!#%%~c!" %%d
- ) else (
-
- call :getn !n! ss
- set sa=%%~c
-
- rem 保留"."后面的尾巴
- if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
-
- echo;!s1!="!ss!" %%d
- set $!n!=!ss!囧%%~c
- set #%%~c=!ss!
- set /a n+=1
- )
- )
-
- ) else (
- if defined s2 (echo;!s1!=%%b) else (echo;!s1!)
- )
-
- )
- ) >temp.txt
-
- set/a n-=1
-
- (
- for /f "tokens=*" %%a in (temp.txt) do (
- set str=%%a
- for /l %%1 in (0,1,!n!) do (
- for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
- set str=!str:@%%c=@%%b!
- set str=!str:#%%c=#%%b!
- )
- )
- echo;!str!
- )
-
- ) > 结果.txt
-
- type 结果.txt
-
- rem 查看有多少个更改
-
- set $
-
- pause
-
- exit /b
-
- rem 计算临名字,可加上前缀
- :getn
-
- (set L=%1
- set M=%1
- set %2=)
-
- :loop
- set /a M=L %% 26
- set %2=!%2!!ASC:~%M%,1!
- if !M! neq !L! set /a L=L/26&goto :loop
- goto :eof
复制代码
作者: 523066680 时间: 2019-5-23 15:37
回复 30# WHY
欢迎过来写感慨:
提问题的正确方式(反面教材)
http://www.bathome.net/viewthread.php?tid=51315
作者: smss 时间: 2019-5-23 15:52
本帖最后由 smss 于 2019-5-23 20:49 编辑
回复 34# netbenton
不要替换成运算符号 无法识别这个 效率是个大问题
PS 1~2秒 电脑好像没费什么事 BAT开了CPU和风扇都感觉有压力 可以想像 两者有很大差距的
还有我已支付 zaqmlp一半钱 但过程不完美 而且他还要加价 在期间还有中伤WHY代码因为没有加UTF8 而乱码的行为 而在那WHY发贴之前zaqmlp给的代码同样效率低下 因此放弃zaqmlp的任何方式方法
以下放上代码 有心可以比对 供交流 不涉及人身攻击 善恶自有分辨
WHY 5.22- $global:n = 65; $h = @{};
- $s = [IO.File]::ReadAllText('manifest.xml', [Text.Encoding]::UTF8);
- $s = [regex]::Replace($s, '(?<=\bname=")[^"]+(?=")',{param($m);$a=$m.Value; if(!$h.ContainsKey($a)){$h[$a]=[char]($global:n++)}; $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});
- [IO.File]::WriteAllText('manifest2.xml', $s, [Text.Encoding]::UTF8);
复制代码
WHY5.22 15:10- @echo off
- 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"
- pause
复制代码
WHY 5.23- $global:n = 0; $Hash=@{};
- $str = [IO.File]::ReadAllText('manifest.xml',[Text.Encoding]::UTF8);
-
- #修改name属性的值
- #如果name属性的值以music_prev或music_display或music_next等开头,或者节点名为Extra,则排除
- $str = [regex]::Replace($str, '(?<=<(?!Extra)[^<>]*\sname=")(?!music_(?:prev|display|next|play|pause))[^"]+(?=")', {
- param($m);
- $key = $m.Value;
- if( !$Hash.ContainsKey($key) ){
- $x = [Math]::floor( $global:n / 26 );
- if($x) { $chr1 = [char]( 64 + [int]$x ) } else { $chr1 = '' }
- $Hash[$key] = $chr1 + [char]( 65 + $global:n++ % 26 );
- }
- $Hash[$key];
- })
-
- #如果属性值包含@#字符,或者属性值以 .animation或.visibility 结尾,则修改
- $str = [regex]::Replace($str, '(?<=")([^"@#]*[@#][^"]+|[^"]+(?:\.animation|\.visibility))(?=")', {
- param($m);
- $s = $m.Groups[1].Value;
- forEach( $key In $Hash.Keys ) {
- $s = $s.Replace( '@' + $key, '@' + $Hash[$key] );
- $s = $s.Replace( '#' + $key, '#' + $Hash[$key] );
- $s = $s.Replace( $key + '.animation', $Hash[$key] + '.animation' );
- $s = $s.Replace( $key + '.visibility', $Hash[$key] + '.visibility' );
- }
- $s;
- })
-
- [IO.File]::WriteAllText('manifest2.xml', $str, [Text.Encoding]::UTF8);
-
- echo 'Done';
- [Console]::ReadKey()
复制代码
zaqmlp5.22- @echo off
- cd /d "%~dp0"
- set "folder=结果"
- md "%folder%" 2>nul
- powershell -NoProfile -ExecutionPolicy bypass ^
- $files=@(dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.xml')});^
- $arr='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray();^
- for($i=0;$i -lt $files.length;$i++){^
- write-host $files[$i].Name;^
- $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
- $m=[regex]::matches($text,'name=\""([^^\""]+)\""');^
- $n=65;^
- $newtext=$text;^
- if($m.Count -ge 1){^
- for($j=0;$j -lt $m.Count;$j++){^
- $kw=$m[$j].groups[0].value;^
- if(-not $dic.ContainsKey($kw)){^
- $c=@(get-random -input $arr -count 3) -join '';^
- while($list.ContainsKey($c)){$c=@(get-random -input $arr -count 3) -join '';};^
- $list.add($c,'');^
- $newtext=$newtext.replace($kw,'name=\"'+$c+'\"');^
- $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}});^
- $dic.add($kw,[char]$n);^
- $n++;^
- };^
- };^
- [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
- };^
- }
- pause
复制代码
zaqmlp5.23- @echo off
- cd /d "%~dp0"
- set "folder=结果"
- md "%folder%" 2>nul
- powershell -NoProfile -ExecutionPolicy bypass ^
- $files=@(dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.xml')});^
- $arr='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray();^
- for($i=0;$i -lt $files.length;$i++){^
- write-host $files[$i].Name;^
- $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
- $m=[regex]::matches($text,'name=\""([^^\""]+)\""');^
- $n=65;^
- $newtext=$text;^
- if($m.Count -ge 1){^
- for($j=0;$j -lt $m.Count;$j++){^
- $kw=$m[$j].groups[0].value;^
- if(-not $dic.ContainsKey($kw)){^
- $c=@(get-random -input $arr -count 3) -join '';^
- while($list.ContainsKey($c)){$c=@(get-random -input $arr -count 3) -join '';};^
- $list.add($c,'');^
- $newtext=$newtext.replace($kw,'name=\"'+$c+'\"');^
- $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}});^
- $dic.add($kw,[char]$n);^
- $n++;^
- };^
- };^
- [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
- };^
- }
- pause
复制代码
zaqmlp5.23- @echo off
- cd /d "%~dp0"
- set "folder=结果"
- md "%folder%" 2>nul
- powershell -NoProfile -ExecutionPolicy bypass ^
- $files=@(dir^|?{($_ -is [System.IO.FileInfo]) -and ($_.Extension -eq '.xml')});^
- $arr='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray();^
- for($i=0;$i -lt $files.length;$i++){^
- write-host $files[$i].Name;^
- $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $list=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
- $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
- $m=[regex]::matches($text,'(?^<!^<Extra )name=\""([^^\""]+)\""');^
- $newtext=$text;^
- if($m.Count -ge 1){^
- for($j=0;$j -lt $m.Count;$j++){^
- $kw=$m[$j].groups[1].value;^
- if(@('=','%%') -notcontains $kw){^
- if(-not $dic.ContainsKey($kw)){^
- $c=@(get-random -input $arr -count 3) -join '';^
- while($list.ContainsKey($c)){$c=@(get-random -input $arr -count 3) -join '';};^
- $list.add($c,'');^
- $newtext=$newtext.replace($m[$j].groups[0].value,'name=\"'+$c+'\"');^
- $dic.add($kw,$c);^
- $n++;^
- };^
- };^
- };^
- $k=@($dic.keys^|sort {$_.length} -des);^
- $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});^
- [IO.File]::WriteAllText(('%folder%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
- };^
- }
- pause
复制代码
作者: 523066680 时间: 2019-5-23 16:14
他这个多半是工作需求,商业用途,大概是抬高逆向门槛吧?
其中主要是 XML 的混淆。由于限制了批处理 和 PS,批处理正则不够强,还是 PS 划算。
但是即使用 PS,正则表达式要完美处理[后续可能产生的需求]也会让代码变得很复杂。所以建议是找一个 XML Parser(解析器)模块,PS肯定有,就是不知道需不需要额外安装。
让解析器去把XML变成数据结构,这样自由度就高了。
这样的问题,加价很合理啊。
作者: smss 时间: 2019-5-23 16:26
回复 38# 523066680
是的 降低可读性并不能彻底阻断逆向 还需加密 有个矛盾在解读时就必然要提供个解密器 这是双向的
目前有一可用JAVA工具是不能适用包含数组的文本 所以另寻方法
作者: zaqmlp 时间: 2019-5-23 16:37
回复 36# smss
“中伤”是你的用词,我只是说了会乱码的事实,而且你自己23楼也验证了;需求一再变动,加价很合理,买卖不成,仁义要在,你在这煽动情绪也没用
作者: netbenton 时间: 2019-5-23 16:38
复制代码
找到出现替换错误的原因了,"QA"之后不是空格,而是其它字符的时,会出错,以下代码已经处理好- goto :ansi
- rem UTF-8 编码支持
- chcp 65001
- cls
-
- :ansi
- @echo off
-
-
- setlocal enabledelayedexpansion
-
-
- set /p "strFile=请拖入处理文本:"
- if not exist !strFile! (
- echo;"!strFile!" 文件不找不到!!
- exit /b
- )
-
- rem 定义用于命名的字符表
- set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set n=0
-
- rem 例外情况定义
- set exception=Extra Button
-
- (
- for /f "tokens=1* delims==" %%a in (!strFile!) do (
- set s1=%%a
- set s2=%%b
- set z=
- for %%k in (%exception%) do (if "!s1:%%k=!" neq "!s1!" (set z=y))
- if "!z!!s1:~-5!" equ " name" (
- set s3=!s2:^"= !
- for /f "tokens=1* delims= " %%c in ("!s3!") do (
- if defined #%%~c (
- echo;!s1!="!#%%~c!" %%d
- ) else (
-
- call :getn !n! ss
- set sa=%%~c
-
- rem 保留"."后面的尾巴
- if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
-
- echo;!s1!="!ss!" %%d
- set $!n!=!ss!囧%%~c
- set #%%~c=!ss!
- set /a n+=1
- )
- )
-
- ) else (
- if defined s2 (echo;!s1!=%%b) else (echo;!s1!)
- )
-
- )
- ) >temp.txt
-
- set/a n-=1
-
- (
- for /f "tokens=*" %%a in (temp.txt) do (
- set str=%%a
- for /l %%1 in (0,1,!n!) do (
- for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
- set str=!str:@%%c=@%%b!
- set str=!str:#%%c=#%%b!
- )
- )
- echo;!str!
- )
-
- ) > 结果.txt
-
- type 结果.txt
-
- rem 查看有多少个更改
-
- set $
-
- pause
-
- exit /b
-
- rem 计算临名字,可加上前缀
- :getn
-
- (set L=%1
- set M=%1
- set %2=)
-
- :loop
- set /a M=L %% 26
- set %2=!%2!!ASC:~%M%,1!
- if !M! neq !L! set /a L=L/26&goto :loop
- goto :eof
复制代码
作者: smss 时间: 2019-5-23 17:12
本帖最后由 smss 于 2019-5-23 17:22 编辑
回复 39# zaqmlp
你给代码出错 导致测试手机无法开机 我没有说什么 又质疑这方法不行 而且问到你应该怎样改一个筛选条件都不说的 说的前提是加钱的(建议你以后加行代码加次价钱) 你上来说别和你扯这个 那请问不扯这个我花钱请你做什么 请不要在我的帖子下留言了
只怪自己问题没有解决就先打钱
作者: zaqmlp 时间: 2019-5-23 17:31
回复 41# smss
事实你最初的方式就是不行呀,如果只按你最初的需求,替换后为什么你要一再变更需求,而且我让你找出替换后不对的地方,你一直跟我扯手机不行有什么用,你要告诉我哪里替换不对
作者: xczxczxcz 时间: 2019-5-23 20:37
回复 35# 523066680
PS 可以完全操控 XML 按节点操作。问题是楼主问题不详。不敢写,没完没了。他自己都没有一个完整的修改方案出来。不让人家累死。
作者: xczxczxcz 时间: 2019-5-23 20:43
回复 41# smss
可以把你要解决的问题具有完整代表性发一份上来。还有完整的要求。本简单的事搞这么复杂。让大神们一次给你搞定。
作者: smss 时间: 2019-5-23 20:47
回复 44# xczxczxcz
关键问题是不可能一下子知道全部要做具体哪些 只能说个大概 然后在发现问题的地方排查
作者: xczxczxcz 时间: 2019-5-23 20:49
回复 523066680
是的 降低可读性并不能彻底阻断逆向 还需加密 有个矛盾在解读时就必然要提供个解密器 这 ...
smss 发表于 2019-5-23 16:26
个人感觉这样混淆。 要破解也就是多搜索一下。还是把APK写好些。
作者: smss 时间: 2019-5-23 20:54
回复 46# xczxczxcz 谷歌有混淆器的 这个大家都知道 也就不是什么秘密了 所以要写个不一样的
作者: xczxczxcz 时间: 2019-5-23 21:01
回复 47# smss
做一简单版,和高级版。高级版要收费下载。简单版基本功能要好用。让人家想买高级版。APK加密唉。
作者: WHY 时间: 2019-5-23 23:09
回复 32# smss
已修改,如果还有问题,请其他高手解答。
作者: smss 时间: 2019-5-24 18:58
回复 49# WHY
谢谢你的注释 经过多次 修改调试 含数组的也可以正常工作了
现在只有一关联文本c中关联文本a中变量名,希望也同步替换,生成文本d
文本c特点如下 id="aper" 如果文本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"/>
</Group>
</Config>
希望得到你的答案
作者: WHY 时间: 2019-5-25 12:38
本帖最后由 WHY 于 2019-5-25 12:45 编辑
回复 50# smss
在 echo 'Done' 上面,插入三行:- $str = [IO.File]::ReadAllText('c.txt', [Text.Encoding]::Default);
- $str = [regex]::Replace($str, '(?<=\sid=")[^"]+(?=")', {param($m); if($Hash[$m.Value]){$Hash[$m.Value]}else{$m.Value}});
- [IO.File]::WriteAllText('d.txt', $str, [Text.Encoding]::UTF8);
复制代码
作者: smss 时间: 2019-5-25 17:21
本帖最后由 smss 于 2019-6-1 17:08 编辑
回复 51# WHY
测试了一下 没能成功 生成的文本d就是复制了一个文本c
文本a以前缀#bg或@QQNC调用文本c对应名称id="bg"、id="QQNC" default=""中的值
例如文本a中含<Var name="bg" const="true" expression="ifelse(isnull(#bg),0,#bg)"/>
<Text name="Qm" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="@QQNC" marqueeSpeed="50" marqueeGap="2"/>
<Text name="Qm2" x="100" y="300" w="458" alignV="center" color="#ababab" size="30" textExp="@QQQM" marqueeSpeed="50" marqueeGap="2"/>文本c如下<Config>
<Group text="─=≡Σ(((?つ??ω??)つ超人">
<StringInput text="昵称" id="QQNC" default="smss" />
<StringInput text="签名" id="QQQM" default="百年江湖,谁人与共." />
<CheckBox text="重力壁纸" id="bg" default="0"/>
</Group>
</Config> 文本c中 关联名较少 如果不行就换个思路 不替换文本c中涉及的id="变量名" 仅获取文本c中id="变量名"将其设为文本a替换前的过滤条件
还有如何把<Text x="100" y="300" marqueeGap="2"/>变成<Text x="100"y="300"marqueeGap="2"/>去除中间所有空格只保留第一个空格 应该怎样改
作者: netbenton 时间: 2019-5-26 00:07
回复 52# smss
这两个比较容易实现,BAT也可以做到,关于需要过滤固定数组的地方有没有举例的文本?
作者: netbenton 时间: 2019-5-26 11:58
除了数组,其它的做解决了~~~- goto :ansi
- rem UTF-8 编码支持
- chcp 65001
- cls
-
- :ansi
- @echo off
-
-
- setlocal enabledelayedexpansion
-
-
- set /p "strFile=请拖入处理文本:"
- if not exist !strFile! (
- echo;"!strFile!" 文件不找不到!!
- exit /b
- )
-
- rem 定义用于命名的字符表
- set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set n=0
-
- rem 例外情况定义
- set exception=Extra Button
-
- (
- for /f "tokens=1* delims==" %%a in (!strFile!) do (
- set s1=%%a
- set s2=%%b
- set z=
- for %%k in (%exception%) do (if "!s1:%%k=!" neq "!s1!" (set z=y))
- if "!z!!s1:~-5!" equ " name" (
- set s3=!s2:^"= !
- for /f "tokens=1 delims= " %%c in ("!s3!") do (
- if defined #%%~c (
- echo;%%a=%%b
- ) else (
-
- call :getn !n! ss
- set sa=%%~c
-
- rem 保留"."后面的尾巴
- if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
-
- echo;!s1!="!ss!" %%d
- set $!n!=!ss!囧%%~c
- set #%%~c=!ss!
- set /a n+=1
- )
- )
-
- ) else (
- if defined s2 (echo;!s1!=%%b) else (echo;!s1!)
- )
-
- )
- ) >temp.txt
-
- set/a n-=1
-
- (
- for /f "tokens=1,*" %%a in (temp.txt) do (
-
- set str=%%b
- if defined str (set str=%%a !str: =!) else set str=%%a
-
- for /l %%1 in (0,1,!n!) do (
- for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
- set str=!str:"%%c"="%%b"!
- set str=!str:@%%c=@%%b!
- set str=!str:#%%c=#%%b!
- )
- )
- echo;!str!
- )
-
- ) > 结果.txt
-
- start 结果.txt
-
- rem 查看有多少个更改
-
- set $
-
- pause
-
- exit /b
-
- rem 计算临名字,可加上前缀,A-Z,AA-ZZ,AAA-ZZZ,AAAA-ZZZZ ……
- :getn
-
- (set L=%1
- set M=%1
- set %2=)
-
- :loop
- set /a M=L %% 26
- set %2=!%2!!ASC:~%M%,1!
- if !M! neq !L! set /a L=L/26&goto :loop
- goto :eof
复制代码
作者: xczxczxcz 时间: 2019-5-26 21:15
回复 54# netbenton
以前偶用纯P写的时候,经常前面设好的坑到后面忘记填坑。唉。现在一些旧的脚本还保留着原P外,新的一律用PS写。用P写的时候经常要用硬盘做临时存储交换。特别是有特殊符号时。现在基本只用内存交换。
《题外话。自从用了win10后,我已经坏了两块机械硬盘。因为读盘比以前的系统更利害了。SSD倒是5年了还正常。Windows Defender 已禁止它随意乱动。》
----------现在看到用纯P写长脚本时就有一种莫明恐惧感!
作者: netbenton 时间: 2019-5-27 00:03
数组也可以处理了。
终于全部搞好了,连特殊符号“!”号也处理好了!!!复制代码
作者: netbenton 时间: 2019-5-27 00:04
回复 55# xczxczxcz
我觉得批处理也可以做得到
作者: amwfjhh 时间: 2019-5-27 01:05
回复 56# netbenton
代码风格看着舒服…
作者: smss 时间: 2019-5-27 01:48
本帖最后由 smss 于 2019-5-27 01:58 编辑
回复 56# netbenton
放弃吧
比对一下 会出现如下错误 如 name="sh" expression="#screen_height" 被替换成name="QHA" expression="#screen_height"
当出现@shqwfwdwe或@Shqwfwdwe这种将被替换@QHAqwfwdwe 它不判断大小写和完整字符
作者: netbenton 时间: 2019-5-28 00:59
回复 59# smss
1,加入了区分大小写
2,加入了完整词检查
3,加入了多种位置变量的替换,自己可以根据情况添加复制代码
作者: Batcher 时间: 2019-5-28 08:20
回复 59# smss
兄弟,你可不能劝人放弃啊
请坚信:这个论坛里面绝大部分人写代码不是为了挣钱
作者: smss 时间: 2019-5-28 13:57
回复 61# Batcher 我是怕浪费了他的宝贵时间
作者: smss 时间: 2019-6-1 17:13
本帖最后由 smss 于 2019-6-4 15:25 编辑
回复WHY
图1图2是a文件和b文件比对存在的问题 如果名称是A 替换成了B 当出现@AA或者@ABC时(且没有任何name="AA"与之关联时)会被替换成@BA或@BBC
图3是c文件和d文件比对存在的问题
如何批量删除src=""中.png.jpg.webp 及srcExp=""中.png.jpg.webp或+'.png'+'.jpg'+'.webp'同步变更目录下脚本中涉及的图片名称
如
<Image src="Ai/123.png" x="0" y="0"/>
<Image src="Ai/c.jpg" x="100" y="20"/>
<Image src="Ai/345.webp" x="1003" y="203"/>
<Image srcExp="'Ai/timing/'+ifelse(#start_pause==1,'Stop','count')+'.png'"/> 注意其中可能涉及变量名需要同步
方案A 改名称为A~ZZZZ之间
<Image src="Ai/A" x="0" y="0"/>
<Image src="Ai/B" x="100" y="20"/>
<Image src="Ai/C" x="1003" y="203"/>
<Image srcExp="'Ai/timing/'+ifelse(#start_pause==1,#A,#B)+'.png'"/>
方案B 仅删除后缀 但是需要规避重名 (如同时出现1.png和1.jpg时 删除后缀将导致重名冲突)
<Image src="Ai/123" x="0" y="0"/>
<Image src="Ai/c" x="100" y="20"/>
<Image src="Ai/345" x="1003" y="203"/>
<Image srcExp="'Ai/timing/'+ifelse(#start_pause==1,'Stop','count')"/>
还有我应该怎样改成 PowerShell "" 这样以BAT方式运行的 加了几个^有什么特殊的地方说明吗?
以下是目前的- $global:n = 0; $Hash=@{};
- $str = [IO.File]::ReadAllText('manifest.xml',[Text.Encoding]::Default);
-
- #修改name属性的值,如果name属性值以music_prev或music_display或music_next等开头,或者节点名为Extra,则不修改
- $reg1 = '(?<=<(?!Extra)[^<>]*\sname=")(?!notice)(?!music_(?:prev|display|next|play|pause|album_cover))(?!notification_(?:icon|title|content|time|info|subtext|key|list))[^"]+(?=")';
-
- #如果command与target同时出现,command="play",则修改target属性值,
- $reg2 = '(?<=\starget=")[^"]+(?="[^<>]*\scommand="play)|(?<=\scommand="play[^<>]*\starget=") [^"]+(?=")';
-
- $str = [regex]::Replace($str, $reg1 + '|' + $reg2, {
- param($m);
- $key = $m.Value;
- if( !$Hash.ContainsKey($key) ){
- $x = [Math]::floor( $global:n / 26 );
- if($x) { $chr1 = [char]( 64 + [int]$x ) } else { $chr1 = '' }
- $Hash[$key] = $chr1 + [char]( 65 + $global:n++ % 26 );
- }
- $Hash[$key];
- })
-
- $arrKey = $Hash.Keys | sort -Desc {$_.Length};
-
- #如果属性值包含@#字符,或者属性值以 .animation或.visibility 结尾,则修改
- $str = [regex]::Replace($str, '(?<=")([^"@#]*[@#][^"]+|[^"]+(?:\.animation|\.visibility))(?=")', {
- param($m);
- $s = $m.Groups[1].Value;
- forEach( $key In $arrKey ) {
- $s = $s.Replace( '@' + $Key, '@' + $Hash[$Key] );
- $s = $s.Replace( '#' + $Key, '#' + $Hash[$Key] );
- $s = $s.Replace( $Key + '.animation', $Hash[$Key] + '.animation' );
- $s = $s.Replace( $Key + '.visibility', $Hash[$Key] + '.visibility' );
- }
- $s;
- })
-
- [IO.File]::WriteAllText('manifest2.xml', $str, [Text.Encoding]::UTF8);
-
- $str = [IO.File]::ReadAllText('config.xml', [Text.Encoding]::Default);
- $str = [regex]::Replace($str, '(?<=\sid=")[^"]+(?=")', {param($m); if($Hash[$m.Value]){$Hash[$m.Value]}else{$m.Value}});
- [IO.File]::WriteAllText('config2.xml', $str, [Text.Encoding]::UTF8);
-
- echo 'Done';
- [Console]::ReadKey()
复制代码
作者: 523066680 时间: 2019-6-2 15:19
名字怕重复可以用 MD5 啊。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |