批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖
回复 27# Batcher


    您可以开一个FFMPEG专区吗?
现在各种视频、直播那么火,
FFMPEG作为行内的领头开源软件/框架,
命令行版本也有许多人想学习。

TOP

回复 30# uhjjhjff11d


    你要是想学的话,我可以教你怎么改;
但你要抬杠的话,根本不值一驳,我已经说过了,是“多数楼层的答案”,并且你完全站在提问者的角度。

拿不出完美的、比正则更好的解决方法,又极力指责“滥用正则”、“邪道”、“错误的技术”,这是正常人干的事吗?

TOP

还是那句话:能够解决问题的方法,不喜欢你可以不用,甚至不相信它,但不要轻易指责它。

TOP

本帖最后由 uhjjhjff11d 于 2019-11-10 10:37 编辑

回复 33# WHY
还是那句话:能够解决问题的方法,不喜欢你可以不用,甚至不相信它,但不要轻易指责它。

我應該澄清一下,在有現成且可靠的 api 的情況下,我覺得用正則差不多就是邪道,雖然我偶爾也會用正則。
錯誤的技術是看用什麼角度來看,如果你們交付的是代碼,面對的客戶是不太懂代碼的人,寫的東西客戶看不懂,不會改,那這技術在事實上就已經失敗。
如果交付的是產品而不只是代碼,那你們一開始隨著不專業的客戶起舞,聽他的話搞什麼 a b c ... zzz 這種東西,然後怪罪他需求變動,以結果論這技術也是失敗的。因為已經造成客戶的時間和精力上的損失了。他手機出問題了,他發現的東西確實是 bug(例如不要用符號替換變量這件事情,不需要客戶寫在合約裡面吧?)。

如果在軟體設計初期,架構常常改動,那絕對是正則配上隨便什麼協議(純文本自己約定格式或者 json 或者隨便什麼東西)好用。但是如果是大公司的話,通常會建立一套抽象層降低『精英』的效率,但是提高其他所有人的效率和協作的可能,而且雖然底層要多維護一套庫,但是上層的操作就與底層的數據結構一定程度隔離了,看場景看人來選技術(廢話)。我是平庸大眾啊

  • 易讀:庫代碼勝
  • 易改:庫代碼勝。如果全公司都用這一套庫,將來 xml 協議更新了(或者有不同版本),只要改庫函數,所有的上層的代碼全部不用改。因為已經建立了一層抽象,我根本不需要在意協議改了,只要庫代碼有更新就行了。我這裡只是舉例,我不是說 xml 整天在改
  • 測試足夠多:庫代碼勝(人多而且只要有大公司或社群踩坑,大的問題都不用擔心了)
  • 速度:xml 相關的庫代碼只需要對 xml 格式負責,正則對無格式的文件負責,要提速的話哪一個容易?別一上來就說正則快了。


回复 32# WHY
拿不出完美的、比正则更好的解决方法,又极力指责“滥用正则”、“邪道”、“错误的技术”


100元人民币 求bat或Powershell处理文本内容【已解决】
  1. <Variable name="A" type="string" column="city_id"/>
  2. <Variable name="B" type="string" column="city_name"/>
复制代码
原帖的需求是改 Variable 的 name 的字串,這裡我沒有原檔,這裡的東西和範本確實不同,例如 type 和 name 和 column 是在一起的,但是我手上沒有這樣的 xml,我就不處理了,查查接口就行了。底下示範改所有的 Type。

這裡寫一個範例,證明我並不是拿不出來。如果有什麼小錯誤,第一我相信很好改,第二我不懂 xml 也沒用到,我沒興趣改。
最後版本的代碼裡面寫的需求 "如果name属性值以music_prev或music_display或music_next等开头,或者节点名为Extra,则不修改"
非 Extra 的節點,只需要一行。如果屬性值是指 name="屬性值" 一行解決。我不想寫,因為我手上沒有好的測試文件。
  1. $xmlfile = 'C:\Users\username\Documents\sample.xml'
  2. [XML]$xmlcontent = Get-Content $xmlfile
  3. function hash($string) {
  4.     # hash 參考網路(網址懶得找了,反正這裡都是系統的 api),這裡就是混淆函數,看喜歡怎麼改
  5.     new-object System.Security.Cryptography.SHA256Managed | ForEach-Object { $_.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($string)) } | ForEach-Object { $all += $_.ToString("x2") }
  6.     # 避免開頭是數字,覺得字串太長自己縮短即可
  7.     "varhead" + $all
  8. }
  9. $xmlcontent.SelectNodes("//*") | ForEach-Object {
  10.     if (-not ($_.Type -eq $null)){
  11.         $_.Type = hash($_.Type)
  12.     } else {
  13.         Write-Output "pass"
  14.     }
  15. }
  16. $xmlcontent.Save(".\sample2.xml")
复制代码
我的代碼處理的 xml 範例(來自網絡,教學目的,來源懶得找......)
  1. <?xml version="1.0"?>
  2. <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
  3.   <Address Type="Shipping">
  4.     <Name>Ellen Adams</Name>
  5.     <Street>123 Maple Street</Street>
  6.     <City>Mill Valley</City>
  7.     <State>CA</State>
  8.     <Zip>10999</Zip>
  9.     <Country>USA</Country>
  10.   </Address>
  11.   <Address Type="Billing">
  12.     <Name>Tai Yee</Name>
  13.     <Street>8 Oak Avenue</Street>
  14.     <City>Old Town</City>
  15.     <State>PA</State>
  16.     <Zip>95819</Zip>
  17.     <Country>USA</Country>
  18.   </Address>
  19.   <DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>
  20.   <Items>
  21.     <Item PartNumber="872-AA">
  22.       <ProductName>Lawnmower</ProductName>
  23.       <Quantity>1</Quantity>
  24.       <USPrice>148.95</USPrice>
  25.       <Comment>Confirm this is electric</Comment>
  26.     </Item>
  27.     <Item PartNumber="926-AA">
  28.       <ProductName>Baby Monitor</ProductName>
  29.       <Quantity>2</Quantity>
  30.       <USPrice>39.98</USPrice>
  31.       <ShipDate>1999-05-21</ShipDate>
  32.     </Item>
  33.   </Items>
  34. </PurchaseOrder>
复制代码
你的代碼
  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
复制代码
60樓的代碼
  1. goto :ansi
  2. rem UTF-8 编码支持
  3. chcp 65001
  4. cls
  5. :ansi
  6. @echo off
  7. set /p "strFile=请拖入处理文本:"
  8. setlocal enabledelayedexpansion
  9. if not exist !strFile! (
  10. echo;"!strFile!" 文件不找不到!!
  11. exit /b
  12. )
  13. endlocal
  14. rem 定义用于命名的字符表
  15. set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  16. set n=0
  17. rem 定义可用于命名的字符表
  18. set tab="." [ + - ^"
  19. rem 例外情况定义
  20. set exception=Extra Button
  21. set z=
  22. set o=
  23. setlocal enabledelayedexpansion
  24. for /f "tokens=1* delims==" %%a in (!strFile!) do (
  25. for /f "tokens=1,2 delims= " %%K in ("1 !z!") do (
  26. endlocal
  27. set z=%%L
  28. set s1=%%a
  29. set s2=%%b
  30. setlocal enabledelayedexpansion
  31. )
  32. if defined z for %%k in (%exception%) do (
  33. if "#!s1:</%%k>=!" neq "#!s1!" (
  34. set z=!z:~1!
  35. )
  36. )
  37. for %%k in (%exception%) do (
  38. if "!s1:<%%k=!" neq "!s1!" (
  39. if "#!s2:/>=!" equ "#!s2!" (
  40. set z=!z!y
  41. ) else (
  42. set o=o
  43. )
  44. )
  45. )
  46. if "!o!!z!!s1:~-5!" equ " name" (
  47. set s3=!s2:^"= !
  48. for /f "tokens=1 delims= " %%c in ("!s3!") do (
  49. if not defined #%%~c (
  50. call :getn !n! ss
  51. set sa=%%~c
  52. rem 保留"."后面的尾巴
  53. if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
  54. for /f "tokens=1,2,3 delims= " %%x in ("!n! !ss! !z!") do (
  55. endlocal
  56. set $%%x=%%y囧%%~c
  57. set #%%~c=%%y
  58. set /a n+=1
  59. set z=%%z
  60. setlocal enabledelayedexpansion
  61. )
  62. )
  63. )
  64. )
  65. )
  66. set/a n-=1
  67. (
  68. for /f "tokens=1,*" %%a in (!strFile!) do (
  69. endlocal
  70. set stra=%%a
  71. set str=%%b
  72. setlocal enabledelayedexpansion
  73. if defined str (
  74. set "str=!stra! !str: =!"
  75. for /l %%1 in (0,1,%n%) do (
  76. for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
  77. if "!str:%%c=!" neq "!str!" (
  78. if "!str:%%c=%%c!" equ "!str!" (
  79. set str=!str:"%%c"="%%b"!
  80. set str=!str:"@%%c"="@%%b"!
  81. set str=!str:"#%%c"="#%%b"!
  82. if "!str:*%%c=!" neq "!str!" (
  83. call :parti %%c %%b
  84. )
  85. ))
  86. )
  87. )
  88. ) else (
  89. set str=%%a
  90. )
  91. echo;!str!
  92. )
  93. ) >结果.txt
  94. start 结果.txt
  95. rem 查看有多少个更改
  96. set $
  97. pause
  98. exit /b
  99. rem 计算临名字,可加上前缀,多个,A 到 ZZZZ 多个
  100. :getn
  101. (set L=%1
  102. set M=%1
  103. set %2=)
  104. :loop
  105. set /a M=L %% 26
  106. set %2=!%2!!ASC:~%M%,1!
  107. if !M! neq !L! set /a L=L/26&goto :loop
  108. goto :eof
  109. rem 非双引号位置处理 如:#xxxx+  #xxxx[  ]  #xxxx.dir  
  110. :parti
  111. for %%a in (!tab!) do (
  112. if "!str:%1%%~a=!" neq "!str!" (
  113. if "!str:%1%%~a=%1%%~a!" equ "!str!" (
  114. set str=!str:@%1%%~a=@%2%%~a!
  115. set str=!str:#%1%%~a=#%2%%~a!
  116. if "!str:*%1=!" equ "!str!" (
  117. goto :partiE
  118. )
  119. )
  120. )
  121. )
  122. :partiE
  123. goto :eof
复制代码
那個帖子最後一個版本的代碼
  1. $global:n = 0; $Hash=@{};
  2. $str = [IO.File]::ReadAllText('manifest.xml',[Text.Encoding]::Default);
  3. #修改name属性的值,如果name属性值以music_prev或music_display或music_next等开头,或者节点名为Extra,则不修改
  4. $reg1 = '(?<=<(?!Extra)[^<>]*\sname=")(?!notice)(?!music_(?:prev|display|next|play|pause|album_cover))(?!notification_(?:icon|title|content|time|info|subtext|key|list))[^"]+(?=")';
  5. #如果command与target同时出现,command="play",则修改target属性值,
  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('manifest2.xml', $str, [Text.Encoding]::UTF8);
  31. $str = [IO.File]::ReadAllText('config.xml', [Text.Encoding]::Default);
  32. $str = [regex]::Replace($str, '(?<=\sid=")[^"]+(?=")', {param($m); if($Hash[$m.Value]){$Hash[$m.Value]}else{$m.Value}});
  33. [IO.File]::WriteAllText('config2.xml', $str, [Text.Encoding]::UTF8);
  34. echo 'Done';
  35. [Console]::ReadKey()
复制代码

TOP

我该说你啥好?喜欢抬杠,又抬不到点上。
你把我写的脚本贴出来是几个意思?是想跟你的对比,让我难堪是不是?
既然贴出来了,你看都不看一眼就开始胡咧咧?
他定义 A~ZZZ 变量范围明明有目的,没看见脚本有两个xml文件吗?他想把第二个文件与第一个文件按照某种对应关系进行修改。
明白不?打脸不?疼不?不疼我再打打?
  1. echo 範例
复制代码
你觉得这个脚本咋样?是不是完胜正则万倍?

算啦吧,各回各家,各找各妈。你的帖子我不再回复。

TOP

本帖最后由 uhjjhjff11d 于 2019-11-10 23:58 编辑

回复 35# WHY
我该说你啥好?喜欢抬杠,又抬不到点上。
你把我写的脚本贴出来是几个意思?是想跟你的对比,让我难堪是不是?
既然贴出来了,你看都不看一眼就开始胡咧咧?
他定义 A~ZZZ 变量范围明明有目的,没看见脚本有两个xml文件吗?他想把第二个文件与第一个文件按照某种对应关系进行修改。
明白不?打脸不?疼不?不疼我再打打?
echo 範例

你觉得这个脚本咋样?是不是完胜正则万倍?

算啦吧,各回各家,各找各妈。你的帖子我不再回复。


具體回覆每一個問句

  • 我不知道
  • 既然我說正則不適合用在這裡(至少是上層的操作),當然直接用這裡現有的代碼來對比啊。
  • 沒有什麼誰的代碼如何如何,現在是在說 api 和正則在操作 xml 誰比較有優勢
  • 你們的代碼我不想看是事實,如果我覺得有閱讀的價值,我發這個帖不是打自己的臉嗎?
  • 沒看見,但是這和幾個 xml 文件有什麼關係?
  • 明白了,但是系統的雜湊,同樣的輸入就會得到同樣的輸出,只要變量名沒有改變,多幾個 xml 文件是不會出問題的。
  • 是的,你把我臉打腫了

  • 不用了,我不喜歡被打臉
  • 不怎麼樣
  • 不是

TOP

1. 年轻真好。
2. 一看就是工作不饱和,来人,非洲站票。(参考:朱一旦的枯燥生活)
综合型编程论坛
Writing Code That Nobody Else Can Read.

TOP

返回列表