批處理新手入門導讀[視頻教程]批處理基礎視頻教程[視頻教程]VBS基礎視頻教程
[批處理文件精品]批處理版照片整理器[批處理文件精品]純批處理備份&還原驅動在線第三方下載
返回列表 發帖
回復 30# uhjjhjff11d


    你要是想學的話,我可以教你怎么改;
但你要抬杠的話,根本不值一駁,我已經說過了,是“多數樓層的答案”,并且你完全站在提問者的角度。

拿不出完美的、比正則更好的解決方法,又極力指責“濫用正則”、“邪道”、“錯誤的技術”,這是正常人干的事嗎?

TOP

還是那句話:能夠解決問題的方法,不喜歡你可以不用,甚至不相信它,但不要輕易指責它。

TOP

本帖最后由 uhjjhjff11d 于 2019-11-14 17:34 編輯

回復 33# WHY
還是那句話:能夠解決問題的方法,不喜歡你可以不用,甚至不相信它,但不要輕易指責它。

回復 32# WHY
拿不出完美的、比正則更好的解決方法,又極力指責“濫用正則”、“邪道”、“錯誤的技術”


用庫修改所有 type 節點的範例,大家自行比對哪一個好讀好改。
  1. $xmlfile = 'C:\Users\username\Documents\sample.xml'
  2. [XML]$xmlcontent = Get-Content $xmlfile
  3. function hash($string) {
  4.     new-object System.Security.Cryptography.SHA256Managed | ForEach-Object { $_.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($string)) } | ForEach-Object { $all += $_.ToString("x2") }
  5.     "varhead" + $all
  6. }
  7. $xmlcontent.SelectNodes("//*") | ForEach-Object {
  8.     if (-not ($_.Type -eq $null)){
  9.         $_.Type = hash($_.Type)
  10.     } else {
  11.         Write-Output "pass"
  12.     }
  13. }
  14. $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>
復制代碼


[url=http://bbs.bathome.net/redirect.php?goto=findpost&ptid=52856&pid=220490]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%%[email protected]%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; [email protected]{};
  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-14 17:33 編輯

回復 35# WHY
我該說你啥好?喜歡抬杠,又抬不到點上。
你把我寫的腳本貼出來是幾個意思?是想跟你的對比,讓我難堪是不是?
既然貼出來了,你看都不看一眼就開始胡咧咧?
他定義 A~ZZZ 變量范圍明明有目的,沒看見腳本有兩個xml文件嗎?他想把第二個文件與第一個文件按照某種對應關系進行修改。
明白不?打臉不?疼不?不疼我再打打?
echo 範例

你覺得這個腳本咋樣?是不是完勝正則萬倍?

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


具體回覆每一個問句

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

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

TOP

1. 年輕真好。
2. 一看就是工作不飽和,來人,非洲站票。(參考:朱一旦的枯燥生活)
綜合型編程論壇
Writing Code That Nobody Else Can Read.

TOP

本來不打算再說啥,但剛發現,LZ你把帖子標題和內容全給改掉了,對論壇的建議也沒了?

那你把我的+1分吐出來吧,我不想給你了!

有這閑工夫何不把那不靠譜的“范例”好好完善修改一下,整一個完美版的、比正則更好的讓我心服口服呢?

你認為僅僅靠胡咧咧和“范例”能解決這個問題,掙得到那100塊錢是嗎?

TOP

[uri]http://bbs.bathome.net/thread-53435-1-1.html[/uri]
用正則比用xml快。修改屬性值的計算表達式不會對腳本產生影響。其它情況若屬性值中引號之類時正則沒有xml方便。若修改具體的節點屬性時xml方便。
再次醬油。
QQ: 458609586
腳本默認優先 [PowerShell]

TOP

本帖最后由 uhjjhjff11d 于 2019-11-16 01:41 編輯

回復 37# WHY
我可以重述一些內容

  • 論壇上傳文件有點問題(補充:在 edge 上允許 flash 之後還是無法上傳,firefox 和 chrome 默認都是禁止 flash 的,當然都可以啟用但是我沒去試)
  • 只需要一行 if else 就能解決的問題拿到論壇問越積越多會浪費其他人的時間 (這個是靠自覺的,寫了沒有用所以刪除)
  • 帖子的標題應該寫清楚處理特殊格式的文件,沒興趣的人就不用點進去(這個是靠自覺的,寫了沒有用所以刪除)
  • 沒註釋
  • 不太能理解在沒必要的時候為什麼要混 batch + PowerShell + .net
  • 有些帖子的代碼會把無關的文件給搞砸,而且並沒有完全解決標題要解決的問題,但是標題寫已解決


網路上很多 PowerShell 操作 xml 的影片和文檔,更好的寫法多的是。前幾樓很明顯有其他論壇的老人常常在用 xml 了,如果對 PowerShell 操作 xml 感興趣,應該去請教那些常常處理 xml 的人
我(扣除雜湊和 if else )只是寫一行代碼示範用 api 處理節點批量改名(沒需求沒興趣沒能力沒時間去寫我不感興趣的代碼),如果那寫法會把 xml 結構搞砸的話歡迎指教。

TOP

xmlstarlet啊,xpath的可讀性確實要好不少。
去學去寫去用才有進步。安裝python3代碼存為xx.py 雙擊運行或右鍵用IDLE打開按F5運行

TOP

回復 3# 老劉1號

這是個對象的問題,現在都面向對象
你的對象是程序員,哪怕是業余、初級程序員

但更多的是windows高級用戶
比如我提問,最怕的就是只要一個知識點就能解決的實際問題,你卻給我一本教材叫我全部看完,還說我是伸手黨

我覺的可以大面積推廣付費解答,哪怕一個問題一元兩元的紅包

QQ 20147578

TOP

回復 41# czjt1234


    面向對象還行……

支持付費解答。

TOP

返回列表
36选7开奖结果今天福建 北京pk拾冠军计划免费 贵州茅台股票分析宏观经济分析 上海快3开奖结果查询今天 陕西11选5任选基本走势图 2008上证指数 浙江快乐12下载app 新东方上市股价 体彩幸运赛车开奖结果查询 排名靠前的股票配资平台 江西时时彩二星组选 广西快3开奖l结果 重庆时时彩开奖直播 江西省十一选五真准 排列五直选组合复式怎么中奖 天津十一选五今天第45 陕西11选五最高遗漏